{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Use PY in Linear Algebrea\n",
    "<br>\n",
    "\n",
    "## Chapter Zero 乘法和庫\n",
    "<br>\n",
    "### 矩陣和向量的乘法\n",
    "1. 點乘（dot product）：也被稱為「數量積」「內積」「點積」。結果的絕對值是一個向量在另一個向量方向上的投影的長度誠意另一個向量的長度，是一個標量。\n",
    "2. 叉乘（cross product）：也被稱為「向量積」「外積」。對於兩個 $n$ 緯的向量叉乘，結果是一個和 $n-1$ 個向量都垂直的向量，方向符合右手定則。\n",
    "3. 矩陣乘法：代表了線性變換的過程。\n",
    "<br>\n",
    "\n",
    "### python 的 sympy 库 和 numpy 库\n",
    "说明：sympy 用於模擬和理解，numpy 用於实践。\n",
    "<br> \n",
    "\n",
    "#### sympy\n",
    "`sympy`使用`*`代表矩陣乘法；<br>\n",
    "`sympy`使用`dot`表示點乘；<br>\n",
    "`sympy`使用`cross`表示叉乘<br>\n",
    "`det()`表示行列式；`inv()`表示擬矩陣；`adjugate()`伴隨矩陣<br>\n",
    "\n",
    "#### numpy\n",
    "`numpy`使用`*`表示`array`乘法默認是按照位置的乘法，矩陣`matrix`默認的是矩陣乘法，混合起來的話默認是矩陣乘法；<br>\n",
    "`numpy`使用`dot`表示矩陣`matrix`和`array`的矩陣乘法；<br>\n",
    "`numpy`使用`cross`表示叉乘；<br>\n",
    "`numpy`使用`det()`表示行列式；<br>\n",
    "`.T` 返回自身的轉置；<br>\n",
    "`.H` 返回自身的共軛轉置；<br>\n",
    "`.J` 返回自身的逆矩陣；<br>\n",
    "`.A` 返回自身數據的2維數組的一個視圖（沒有做任何的拷貝）<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Chapter One Matrix \n",
    "\n",
    "數學上，一個$m\\times n$的矩陣是由一個$m$行(row)$n$列(column)元素排列成的矩形陣列，矩陣裡的元素可以是數字、符號或者數學式。在圖像處理、人工智能燈領域，使用矩陣來表示和處理數據非常常見。例：<br>\n",
    "$\\mathbf{A}_{2 \\times 3}=\\begin{bmatrix} 5 & 2 & 7 \\\\ 1 & 3 & 4  \\end{bmatrix}$\n",
    "<br>\n",
    "其中，矩陣$A$的下標$2\\times 3$表示$A$是一個2行3列的矩陣。類似的，另一個示例：<br>\n",
    "$\\mathbf{ B }_{ 4 \\times 4 }=\\begin{bmatrix} 5 & 2 & 7 & 6 \\\\ 1 & 3 & 4 & 2 \\\\ 7 & -1 & 9 & 0 \\\\ 8  & 2 & -2 & 3 \\end{bmatrix}$<br>\n",
    "特別的，如果我們要表示矩陣$A$的第二行第二個元素：3，可以使用$A[2,2]$或者$a_{2,2}$。<br><br>\n",
    "在`python`中的`numpy`庫中提供了`ndarrary`類用於儲存高維數組及普通的數組運算，另外提供了`matrix`類用來支持矩陣運算（矩陣乘法）。下面來舉個例子："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[5 2 7]\n",
      " [1 3 4]]\n",
      "[[15  2  7  6]\n",
      " [ 1  3  4  2]\n",
      " [ 7 -1  9  0]\n",
      " [ 8  2 -2  3]]\n",
      "[[5 2 7]\n",
      " [1 3 4]]\n",
      "[[15  2  7  6]\n",
      " [ 1  3  4  2]\n",
      " [ 7 -1  9  0]\n",
      " [ 8  2 -2  3]]\n"
     ]
    }
   ],
   "source": [
    "#first method to store the matrix\n",
    "import numpy as np\n",
    "\n",
    "a = np.matrix('5 2 7;1 3 4')\n",
    "b = np.matrix('15 2 7 6;1 3 4 2;7 -1 9 0;8 2 -2 3')\n",
    "print(a)#print matrix a\n",
    "print(b)#print matrix b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[5 2 7]\n",
      " [1 3 4]]\n",
      "[[ 5  2  7  6]\n",
      " [ 1  3  4  2]\n",
      " [ 8  2 -2  3]]\n",
      "[[5 2 7]\n",
      " [1 3 4]]\n",
      "[[ 5  2  7  6]\n",
      " [ 1  3  4  2]\n",
      " [ 8  2 -2  3]]\n"
     ]
    }
   ],
   "source": [
    "#second method to store the matrix\n",
    "import numpy as np\n",
    "\n",
    "a = np.matrix([[5,2,7],[1,3,4]])\n",
    "b = np.matrix([[5,2,7,6],[1,3,4,2],[8,2,-2,3]])\n",
    "print(a)#print matrix a\n",
    "print(b)#print matrix b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "這兩種形式完全等效，但是第一種更加直觀，不容易犯錯，所以推薦第一種方式（也很類似`LaTeX`中構成矩陣的寫法）；<br>\n",
    "要把一個`matrix`的對象轉換為`ndarray`對象，可以直接用`getA()`的方法。如果吧`ndarray`對象轉換成`matrx`對象可以用`asmatrix()`方法。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[5 2 7]\n",
      " [1 3 4]]\n",
      "<class 'numpy.ndarray'>\n",
      "[[5 2 7]\n",
      " [1 3 4]]\n",
      "<class 'numpy.matrixlib.defmatrix.matrix'>\n",
      "[[5 2 7]\n",
      " [1 3 4]]\n",
      "<class 'numpy.ndarray'>\n",
      "[[5 2 7]\n",
      " [1 3 4]]\n",
      "<class 'numpy.matrixlib.defmatrix.matrix'>\n"
     ]
    }
   ],
   "source": [
    "b = a.getA()#turn a into ndarray\n",
    "print(b)\n",
    "print(type(b))# the type of b\n",
    "c = np.asmatrix(b)\n",
    "print(c)\n",
    "print(type(c))# the type of c"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如果你要取出矩陣中的某個值，可以使用類似於數組的下標運算符。但是要注意，計算機的計數方式是從0開始的。例如，要取出$A[2,2]$，應該使用："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a[1,1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 運算\n",
    "\n",
    "#### 加\n",
    "矩陣加法的定義非常符合直覺。假設有$\\mathbf{ A }_{ 3 \\times 3 }=\\begin{bmatrix} 1 & 0 & 1 \\\\ 1 & 2 & 1 \\\\ 2 & 1 & 1 \\end{bmatrix}$，$\\mathbf{ B }_{ 3 \\times 3 }=\\begin{bmatrix} 2 & 1 & -1 \\\\ 0 & -1 & 2 \\\\ 2 & -1 & 0 \\end{bmatrix}$，<br> 則：\n",
    "$\\mathbf{A}+\\mathbf{B} = \\begin{bmatrix} 1 & 0 & 1 \\\\ 1 & 2 & 1 \\\\ 2 & 1 & 1 \\end{bmatrix} + \\begin{bmatrix} 2 & 1 & -1 \\\\ 0 & -1 & 2 \\\\ 2 & -1 & 0 \\end{bmatrix} = \\begin{bmatrix} 1+2 & 0+1 & 1+(-1) \\\\ 1+ 0 & 2+(-1) & 1+2 \\\\ 2+2 & 1+(-1) & 1+0 \\end{bmatrix} = \\begin{bmatrix} 3 & 1 & 0 \\\\ 1 & 1 & 3 \\\\ 4 & 0 & 1 \\end{bmatrix}$\n",
    "<br>\n",
    "要注意，兩個矩陣的行數和列數必須相同，否則無定義。下面是`python`示例："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[3 1 0]\n",
      " [1 1 3]\n",
      " [4 0 1]]\n",
      "[[3 1 0]\n",
      " [1 1 3]\n",
      " [4 0 1]]\n"
     ]
    }
   ],
   "source": [
    "a = np.matrix('1 0 1;1 2 1;2 1 1')\n",
    "b = np.matrix('2 1 -1;0 -1 2;2 -1 0')\n",
    "print(a+b)# print a+b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "很容易看出，矩陣的加法滿足交換律和結合律，即$A+B=B+A$，$(A+B)+C=A+(B+C)$。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 減\n",
    "矩陣減法也和加法一樣簡單。對於上面給出的$A$和$B$，有：<br>\n",
    "$\\mathbf{A}-\\mathbf{B}=\\begin{bmatrix} 1 & 0 & 1 \\\\ 1 & 2 & 1 \\\\ 2 & 1 & 1 \\end{bmatrix}-\\begin{bmatrix} 2 & 1 & -1 \\\\ 0 & -1 & 2 \\\\ 2 & -1 & 0 \\end{bmatrix}=\\begin{bmatrix} 1-2 & 0-1 & 1-(-1) \\\\ 1-0 & 2-(-1) & 1-2 \\\\ 2-2 & 1-(-1) & 1-0 \\end{bmatrix}=\\begin{bmatrix} -1 & -1 & 2 \\\\ 1 & 3 & -1 \\\\ 0 & 2 & 1 \\end{bmatrix}$<br>\n",
    "同樣，相減的兩個矩陣行數和列數必須完全相同，否則無定義。下面是`python`示例："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[-1 -1  2]\n",
      " [ 1  3 -1]\n",
      " [ 0  2  1]]\n",
      "[[-1 -1  2]\n",
      " [ 1  3 -1]\n",
      " [ 0  2  1]]\n"
     ]
    }
   ],
   "source": [
    "print(a-b)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 乘\n",
    "矩陣乘法的定義是$A_{i\\times j}$矩陣的每一行的元素分別與$B_{j\\times k}$矩陣的每一列的元素兩兩相乘並詳加，從而，得到新的矩陣$C_{j\\times k$。兩個矩陣能相乘的充份必要條件是第一個矩陣的列數等於第二個矩陣的行數相等，否則，無定義。$\\begin {aligned} \n",
    "\\mathbf{A} \\times \\mathbf{B} &=\\begin{bmatrix} 1 & 0 & 1 \\\\ 1 & 2 & 1 \\\\ 2 & 1 & 1 \\end{bmatrix}\\times \\begin{bmatrix} 2 & 1 & -1 \\\\ 0 & -1 & 2 \\\\ 2 & -1 & 0 \\end{bmatrix} \\\\\\ &=\\begin{bmatrix} 1\\cdot 2+0\\cdot 0+1\\cdot 2 & 1\\cdot 1+0\\cdot (-1)+1\\cdot (-1) & 1\\cdot (-1)+0\\cdot 2+1\\cdot 0 \\\\ 1\\cdot 2+2\\cdot 0+1\\cdot 2 & 1\\cdot 1+2\\cdot (-1)+1\\cdot (-1) & 1\\cdot (-1)+2\\cdot 2+1\\cdot 0 \\\\ 2\\cdot 2+1\\cdot 0+1\\cdot 2 & 2\\cdot 1+1\\cdot (-1)+1\\cdot (-1) & 2\\cdot (-1)+1\\cdot 2+1\\cdot 0 \\end{bmatrix}\\\\\\ &=\\begin{bmatrix} 4 & 0 & -1 \\\\ 4 & -2 & 3 \\\\ 6 & 0 & 0 \\end{bmatrix}\n",
    "\\end {aligned}$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再舉一個行列數不同的例子，假設有$\\mathbf{C}_{2 \\times 3} = \\begin{bmatrix} 5 & 7 & 2 \\\\ 4 & 3 & 1 \\end{bmatrix}$和$\\mathbf{D}_{3 \\times 1} = \\begin{bmatrix} 1 \\\\ 5 \\\\ 6 \\end{bmatrix}$，那麼，我們可以得出：$\\mathbf{C}\\times \\mathbf{D} = \\begin{bmatrix} 5 & 7 & 2 \\\\ 4 & 3 & 1 \\end{bmatrix}\\times \\begin{bmatrix} 1 \\\\ 5 \\\\ 6 \\end{bmatrix}\n",
    " =\\begin{bmatrix} 5 \\cdot 1+ 7 \\cdot 5+ 2\\cdot 6 \\\\ 4\\cdot 1+3\\cdot 5+1\\cdot 6  \\end{bmatrix} =\\begin{bmatrix} 52 \\\\ 25 \\end{bmatrix}$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "與初等代數中學的乘法不同，矩陣的乘法並不滿足交換律，即，$A \\times B \\neq B \\times A$，但是，它滿足分配律：$(A\\times B)\\times C = A\\times (B\\times C)$。<br>\n",
    "再介紹兩個特殊的矩陣：<br>\n",
    "1. 單位矩陣（Identity Matrix）他的特點是與行數和列數相等，對角線上的值都是1，其他值都是0。另一個特點是：它與任意矩陣$A$相乘結果等於$A$。<br>\n",
    "$\\mathbf{I}_{3 \\times 3} = \\begin{bmatrix} 1 & 0 & 0 \\\\ 0 & 1 & 0 \\\\ 0 & 0 & 1 \\end{bmatrix}$這是一個 $3\\times 3$的單位矩陣<br>\n",
    "<br>\n",
    "2. 零矩陣（Null Matrix）顧名思義就是全部元素都是0的矩陣。零矩陣乘以任何矩陣都是零矩陣，與任何矩陣$A$都等於$A$。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "this is a times b:\n",
      "[[ 4  0 -1]\n",
      " [ 4 -2  3]\n",
      " [ 6  0  0]]\n",
      "this is b times a:\n",
      "[[ 1  1  2]\n",
      " [ 3  0  1]\n",
      " [ 1 -2  1]]\n",
      "this is a times b:\n",
      "[[ 4  0 -1]\n",
      " [ 4 -2  3]\n",
      " [ 6  0  0]]\n",
      "this is b times a:\n",
      "[[ 1  1  2]\n",
      " [ 3  0  1]\n",
      " [ 1 -2  1]]\n"
     ]
    }
   ],
   "source": [
    "#python示例\n",
    "print(\"this is a times b:\")\n",
    "print(a*b)\n",
    "print(\"this is b times a:\")\n",
    "print(b*a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "this is c times d:\n",
      "[[52]\n",
      " [25]]\n",
      "this is a times b times d:\n",
      "[[-2]\n",
      " [12]\n",
      " [ 6]]\n",
      "first,we user b times d, then we use a to times the b*d:\n",
      "[[-2]\n",
      " [12]\n",
      " [ 6]]\n",
      "This is a times I:\n",
      "[[ 1.  0.  1.]\n",
      " [ 1.  2.  1.]\n",
      " [ 2.  1.  1.]]\n",
      "This is I times a:\n",
      "[[ 1.  0.  1.]\n",
      " [ 1.  2.  1.]\n",
      " [ 2.  1.  1.]]\n",
      "This is a times z:\n",
      "[[ 0.  0.  0.]\n",
      " [ 0.  0.  0.]\n",
      " [ 0.  0.  0.]]\n",
      "This is z times a:\n",
      "[[ 0.  0.  0.]\n",
      " [ 0.  0.  0.]\n",
      " [ 0.  0.  0.]]\n",
      "this is c times d:\n",
      "[[52]\n",
      " [25]]\n",
      "this is a times b times d:\n",
      "[[-2]\n",
      " [12]\n",
      " [ 6]]\n",
      "first,we user b times d, then we use a to times the b*d:\n",
      "[[-2]\n",
      " [12]\n",
      " [ 6]]\n",
      "This is a times I:\n",
      "[[ 1.  0.  1.]\n",
      " [ 1.  2.  1.]\n",
      " [ 2.  1.  1.]]\n",
      "This is I times a:\n",
      "[[ 1.  0.  1.]\n",
      " [ 1.  2.  1.]\n",
      " [ 2.  1.  1.]]\n",
      "This is a times z:\n",
      "[[ 0.  0.  0.]\n",
      " [ 0.  0.  0.]\n",
      " [ 0.  0.  0.]]\n",
      "This is z times a:\n",
      "[[ 0.  0.  0.]\n",
      " [ 0.  0.  0.]\n",
      " [ 0.  0.  0.]]\n"
     ]
    }
   ],
   "source": [
    "c = np.matrix('5 7 2;4 3 1')\n",
    "d = np.matrix('1;5;6')\n",
    "print(\"this is c times d:\")\n",
    "print(c*d)\n",
    "print(\"this is a times b times d:\")\n",
    "print(a*b*d)\n",
    "print(\"first,we user b times d, then we use a to times the b*d:\")\n",
    "print(a*(b*d))\n",
    "I = np.eye(3)\n",
    "#we defined I as a 3 by 3 indentity matrix;eye() equals to'I = np.matrix('1 0 0;0 1 0;0 0 1')'\n",
    "print(\"This is a times I:\")\n",
    "print(a*I)\n",
    "print(\"This is I times a:\")\n",
    "print(I*a)\n",
    "z = np.zeros([3,3])\n",
    "#we define z as a 3 by 3 null matrix; np.zeros() equals to'z = np.matrix('0 0 0;0 0 0;0 0 0')'\n",
    "print(\"This is a times z:\")\n",
    "print(a*z)\n",
    "print(\"This is z times a:\")\n",
    "print(z*a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### ~~除~~（求逆）\n",
    "<br>\n",
    "矩陣中沒有除法這種操作，但是有一個相似的運算，叫做求逆。在線性代數中，給定一個$n$階的方陣$A$ ，若存在一個$n$階矩陣$B$，使得$AB = BA = I_n$，其中$I_n$為$n$階的單位矩陣，則稱$A$是**可逆**的，而$B$則是$A$的逆矩陣，記作：$A^{-1}$。<br>\n",
    "##### 伴隨陣法：\n",
    "$\\mathbf{A}^{-1}=\\frac{1}{|\\mathbf{A}|}\\begin{bmatrix}A_{11} & A_{21} & \\ldots & A_{n1} \\\\ A_{12} & A_{22} & \\ldots & A_{n2} \\\\ \\ldots & \\ldots & \\ldots & \\ldots \\\\ A_{1n} & A_{2n} & \\ldots & A_{nn} \\end{bmatrix}$，其中$A_{ij}$是$|A|$中元素$a_{ij}$的代數余子式。\n",
    "<br>\n",
    "矩陣$\\begin{bmatrix}A_{11} & A_{21} & \\ldots & A_{n1} \\\\ A_{12} & A_{22} & \\ldots & A_{n2} \\\\ \\ldots & \\ldots & \\ldots & \\ldots \\\\ A_{1n} & A_{2n} & \\ldots & A_{nn} \\end{bmatrix}$稱為矩陣$A$ 的伴隨矩陣，記作$A*$\n",
    "<br>\n",
    "##### 初等變換法：\n",
    "如果矩陣$A$和$B$互逆，則$AB=BA=I$。由$AB=BA$可以得出：兩個矩陣都是方陣；由$AB=I$以及定理“兩個矩陣的乘積的行列式等於兩個矩陣的行列式的乘積”可得：兩個矩陣的行列式不等於零。現在假設三階矩陣${ \\mathbf{A} }_{ 3 \\times 3 }=\\begin{bmatrix} 1 & 0 & 1 \\\\ 1 & 2 & 1 \\\\ 2 & 1 & 1 \\end{bmatrix}$，則：<br>\n",
    "$\\begin{aligned}\n",
    "\\begin{bmatrix}\\mathbf{A} \\mathbf{I}\\end{bmatrix} \n",
    "& \\rightarrow \n",
    "\\begin{bmatrix} \n",
    "1 & 0 & 1 & 1 & 0 & 0 \\\\\n",
    "1 & 2 & 1 & 0 & 1 & 0 \\\\\n",
    "2 & 1 & 1 & 0 & 0 & 1\n",
    "\\end{bmatrix} \n",
    "\\rightarrow \n",
    "\\begin{bmatrix} \n",
    "1 & 0 & 1 & 1 & 0 & 0 \\\\\n",
    "0 & 2 & 0 & -1 & 1 & 0 \\\\\n",
    "2 & 1 & 1 & 0 & 0 & 1\n",
    "\\end{bmatrix}\n",
    "\\rightarrow \n",
    "\\begin{bmatrix} \n",
    "1 & 0 & 1 & 1 & 0 & 0 \\\\\n",
    "0 & 1 & 0 & -0.5 & 0.5 & 0 \\\\\n",
    "2 & 1 & 1 & 0 & 0 & 1\n",
    "\\end{bmatrix}\\\\\n",
    "& \\rightarrow \n",
    "\\begin{bmatrix} \n",
    "1 & 0 & 1 & 1 & 0 & 0 \\\\\n",
    "0 & 1 & 0 & -0.5 & 0.5 & 0 \\\\\n",
    "1 & 1 & 0 & -1 & 0 & 1\n",
    "\\end{bmatrix}\n",
    "\\rightarrow \n",
    "\\begin{bmatrix} \n",
    "1 & 0 & 1 & 1 & 0 & 0 \\\\\n",
    "0 & 1 & 0 & -0.5 & 0.5 & 0 \\\\\n",
    "1 & 0 & 0 & -0.5 & -0.5 & 1\n",
    "\\end{bmatrix}\n",
    "\\rightarrow \n",
    "\\begin{bmatrix} \n",
    "0 & 0 & 1 & 1.5 & 0.5 & -1 \\\\\n",
    "0 & 1 & 0 & 0 & 0.5 & 0 \\\\\n",
    "1 & 0 & 0 & -0.5 & -0.5 & 1\n",
    "\\end{bmatrix}\\\\\n",
    "&\\rightarrow \n",
    "\\begin{bmatrix} \n",
    "1 & 0 & 0 & -0.5 & -0.5 & 1 \\\\\n",
    "0 & 1 & 0 & -0.5 & 0.5 & 0 \\\\\n",
    "0 & 0 & 1 & 1.5 & 0.5 & -1\n",
    "\\end{bmatrix}\n",
    "\\end{aligned}$\n",
    "<br>\n",
    "所以：$\\mathbf{A}^{-1}=\\begin{bmatrix}-0.5 & -0.5 & 1 \\\\ -0.5 & 0.5 & 0 \\\\ 1.5 & 0.5 & -1\\end{bmatrix}$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 奇異矩陣（Singular Matrix）\n",
    "如果一個方陣$A$滿足條件$|A|(det(A))\\neq 0$，則稱$A$為非奇異矩陣（non-singular matrix），否則則稱為奇異矩陣。簡單的說**沒有逆矩陣的矩陣就是奇異矩陣，有逆矩陣的矩陣就是非奇異矩陣**<br>\n",
    "`python`求逆示例："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[-0.5 -0.5  1. ]\n",
      " [-0.5  0.5  0. ]\n",
      " [ 1.5  0.5 -1. ]]\n",
      "[[ 1.  0.  0.]\n",
      " [ 0.  1.  0.]\n",
      " [ 0.  0.  1.]]\n",
      "[[-0.5 -0.5  1. ]\n",
      " [-0.5  0.5  0. ]\n",
      " [ 1.5  0.5 -1. ]]\n",
      "[[ 1.  0.  0.]\n",
      " [ 0.  1.  0.]\n",
      " [ 0.  0.  1.]]\n"
     ]
    },
    {
     "ename": "LinAlgError",
     "evalue": "Singular matrix",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mLinAlgError\u001b[0m                               Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-19-1bb88e56f1ce>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#a times a inverse equals to indentity matrix\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatrix\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'0 1;0 0'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;31m#because f has no inverse, f is a singular matrix\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m/usr/lib/python3/dist-packages/numpy/matrixlib/defmatrix.py\u001b[0m in \u001b[0;36mgetI\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    970\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    971\u001b[0m             \u001b[0;32mfrom\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdual\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpinv\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 972\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0masmatrix\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    973\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    974\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mgetA\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3/dist-packages/numpy/linalg/linalg.py\u001b[0m in \u001b[0;36minv\u001b[0;34m(a)\u001b[0m\n\u001b[1;32m    524\u001b[0m     \u001b[0msignature\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'D->D'\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misComplexType\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m'd->d'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    525\u001b[0m     \u001b[0mextobj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_linalg_error_extobj\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_raise_linalgerror_singular\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 526\u001b[0;31m     \u001b[0mainv\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_umath_linalg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msignature\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msignature\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextobj\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mextobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    527\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mwrap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mainv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult_t\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    528\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3/dist-packages/numpy/linalg/linalg.py\u001b[0m in \u001b[0;36m_raise_linalgerror_singular\u001b[0;34m(err, flag)\u001b[0m\n\u001b[1;32m     88\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     89\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_raise_linalgerror_singular\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflag\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 90\u001b[0;31m     \u001b[0;32mraise\u001b[0m \u001b[0mLinAlgError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Singular matrix\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     91\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     92\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_raise_linalgerror_nonposdef\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflag\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mLinAlgError\u001b[0m: Singular matrix"
     ]
    },
    {
     "ename": "LinAlgError",
     "evalue": "Singular matrix",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mLinAlgError\u001b[0m                               Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-19-1bb88e56f1ce>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#a times a inverse equals to indentity matrix\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatrix\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'0 1;0 0'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;31m#because f has no inverse, f is a singular matrix\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m/usr/lib/python3/dist-packages/numpy/matrixlib/defmatrix.py\u001b[0m in \u001b[0;36mgetI\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    970\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    971\u001b[0m             \u001b[0;32mfrom\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdual\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpinv\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 972\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0masmatrix\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    973\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    974\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mgetA\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3/dist-packages/numpy/linalg/linalg.py\u001b[0m in \u001b[0;36minv\u001b[0;34m(a)\u001b[0m\n\u001b[1;32m    524\u001b[0m     \u001b[0msignature\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'D->D'\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misComplexType\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m'd->d'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    525\u001b[0m     \u001b[0mextobj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_linalg_error_extobj\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_raise_linalgerror_singular\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 526\u001b[0;31m     \u001b[0mainv\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_umath_linalg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msignature\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msignature\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextobj\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mextobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    527\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mwrap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mainv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult_t\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    528\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3/dist-packages/numpy/linalg/linalg.py\u001b[0m in \u001b[0;36m_raise_linalgerror_singular\u001b[0;34m(err, flag)\u001b[0m\n\u001b[1;32m     88\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     89\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_raise_linalgerror_singular\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflag\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 90\u001b[0;31m     \u001b[0;32mraise\u001b[0m \u001b[0mLinAlgError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Singular matrix\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     91\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     92\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_raise_linalgerror_nonposdef\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflag\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mLinAlgError\u001b[0m: Singular matrix"
     ]
    }
   ],
   "source": [
    "a = np.matrix('1 0 1; 1 2 1; 2 1 1')\n",
    "print(a.I) #the inverse of matrix a \n",
    "print(a*a.I) #a times a inverse equals to indentity matrix\n",
    "f = np.matrix('0 1;0 0')\n",
    "print(f.I)#because f has no inverse, f is a singular matrix"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 矩陣的轉置（Transport）\n",
    "在線性代數中，矩陣$A$的轉置是另一個矩陣$A^T$，如下所示：<br>\n",
    "* 把$A$的橫行寫成$A^T$的縱列；\n",
    "* 把$A$的縱列寫成$A^T$的橫行；\n",
    "形式上說就是，$m\\times n$的矩陣$A$的轉置是$n\\times m$矩陣。<br>\n",
    "矩陣$\\underset{m\\times n}{\\mathbf{A}} = \\begin{bmatrix}a_{11} & a_{12} & \\ldots & a_{1n} \\\\ a_{21} & a_{22} & \\ldots & a_{2n} \\\\ \\ldots \\\\ a_{m1} & a_{m2} & \\ldots & a_{mn}\\end{bmatrix}$的轉置定義為$\\underset{n\\times n}{A^{T}} = \\begin{bmatrix}a_{11} & a_{21} & \\ldots & a_{m1} \\\\ a_{12} & a_{22} & \\ldots & a_{m2} \\\\ \\ldots \\\\ a_{1n} & a_{2n} & \\ldots & a_{mn}\\end{bmatrix}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[2 1]\n",
      " [4 3]]\n",
      "[[1 4]\n",
      " [2 5]\n",
      " [3 6]]\n",
      "[[2 1]\n",
      " [4 3]]\n",
      "[[1 4]\n",
      " [2 5]\n",
      " [3 6]]\n"
     ]
    }
   ],
   "source": [
    "#python 示例：\n",
    "a = np.matrix('2 4;1 3')\n",
    "print(a.T)#the transport of a\n",
    "b = np.matrix('1 2 3;4 5 6')\n",
    "print(b.T)#the transport of b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**特別的，矩陣的轉置有一個性質：矩陣的轉置等於矩陣調換後分別做轉置的乘積：$（A\\bullet B)^T = B^T\\bullet A^T$**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[10  7]\n",
      " [32 21]]\n",
      "[[10  7]\n",
      " [32 21]]\n",
      "[[10  7]\n",
      " [32 21]]\n",
      "[[10  7]\n",
      " [32 21]]\n"
     ]
    }
   ],
   "source": [
    "a = np.matrix('2 4;1 3')\n",
    "b = np.matrix('1 6;2 5')\n",
    "c = a*b\n",
    "print(c.T)\n",
    "print(b.T*a.T)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7605c410>,\n",
       " <matplotlib.lines.Line2D at 0x6f831830>]"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7605c410>,\n",
       " <matplotlib.lines.Line2D at 0x6f831830>]"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from pylab import *\n",
    "\n",
    "xlim(-3, 3)\n",
    "ylim(0, 3.5)\n",
    "plt.plot([0,2.5],[3.5,0],'blue',[-1,3],[0,3.5],'red')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以用矩陣表示成：$\\begin{bmatrix}\n",
    "3 & 2 \\\\\n",
    "-1 & 1\n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "x \\\\\n",
    "y\n",
    "\\end{bmatrix}\n",
    "=\n",
    "\\begin{bmatrix}\n",
    "7\\\\\n",
    "1\n",
    "\\end{bmatrix}$\n",
    "<br>\n",
    "設$\\begin{bmatrix}3 & 2 \\\\-1 & 1\\end{bmatrix}$為矩陣$A$，將等式兩邊左乘一個$A$的逆，就可以得到：<br>\n",
    "$\\begin{aligned}\n",
    "A^{-1}A\n",
    "\\begin{bmatrix}\n",
    "x \\\\ y\n",
    "\\end{bmatrix}\n",
    "&= \n",
    "A^{-1}\n",
    "\\begin{bmatrix}\n",
    "7\\\\\n",
    "1\n",
    "\\end{bmatrix}\\\\\\\n",
    "&=\n",
    "\\frac{1}{|A|}\\begin{bmatrix}1 & -2 \\\\ 1 & 3\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "7\\\\\n",
    "1\n",
    "\\end{bmatrix}\\\\\\\n",
    "&=\n",
    "\\frac{1}{5}\\begin{bmatrix}1 & -2 \\\\ 1 & 3\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "7\\\\\n",
    "1\n",
    "\\end{bmatrix}\\\\\\\n",
    "&=\n",
    "\\frac{1}{5}\\begin{bmatrix}5 \\\\ 10\\end{bmatrix}\n",
    "\\end{aligned}$<br>\n",
    "因此，$\\begin{bmatrix}x \\\\ y\\end{bmatrix}=\\begin{bmatrix}1 \\\\ 2\\end{bmatrix}$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "雖然這個方法在二元一次方程這看起來還沒有初中學的校園法解得快，但使用矩陣的好處在於對於更高維的數據，比如成白上千的未知數，這個解法依然有效。<br>\n",
    "在`python`中，我們可以使用`numpy`的線性代數算法庫`linalg`提供的`solve`方法來求解方程組。例："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 1.]\n",
      " [ 2.]]\n",
      "[[ 1.]\n",
      " [ 2.]]\n"
     ]
    }
   ],
   "source": [
    "a = np.matrix('3 2; -1 1')\n",
    "b = np.matrix('7; 1')\n",
    "print(np.linalg.solve(a, b))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 求向量組合\n",
    "假設有向量$\\vec { a }  =  \\begin{bmatrix} 3 \\\\ -1 \\end{bmatrix}$，$\\vec { b }  =  \\begin{bmatrix} 2 \\\\ 1 \\end{bmatrix}$，求兩者如何組成新向量$\\vec { c }  =  \\begin{bmatrix} 7 \\\\ 1 \\end{bmatrix}$？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x70287930>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x70287930>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "soa = np.array([[0, 0, 3, -1], [0, 0, 2, 1], [0, 0, 7, 1]])\n",
    "X, Y, U, V = zip(*soa)\n",
    "plt.figure()\n",
    "ax = plt.gca()\n",
    "ax.quiver(X, Y, U, V, angles='xy', scale_units='xy', scale=1)\n",
    "ax.set_xlim([-1, 10])\n",
    "ax.set_ylim([-1, 10])\n",
    "plt.draw()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如果用$x$和$y$分別表示兩個向量的背書，這個問題就可以用矩陣表示成：$\\begin{bmatrix}3 \\\\-1 \\end{bmatrix}x + \\begin{bmatrix}2 \\\\1\\end{bmatrix}y=\\begin{bmatrix}7\\\\1\\end{bmatrix}$<br>\n",
    "這樣就把這個問題轉換成和上一個問題同構了，使用同樣的方法可以得出：$\\begin{bmatrix}x \\\\ y\\end{bmatrix}=\\begin{bmatrix}1 \\\\ 2\\end{bmatrix}$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x6f654df0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x6f654df0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "soa = np.array([[0, 0, 3, -1], [0, 0, 4, 2], [0, 0, 7, 1],[4,2,3,-1]])\n",
    "X, Y, U, V = zip(*soa)\n",
    "plt.figure()\n",
    "ax = plt.gca()\n",
    "ax.quiver(X, Y, U, V, angles='xy', scale_units='xy', scale=1)\n",
    "ax.set_xlim([-1, 10])\n",
    "ax.set_ylim([-1, 10])\n",
    "plt.draw()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Chapter Two  Determinant\n",
    "\n",
    "### 什麼是行列式\n",
    "\n",
    "**行列式**（Dterminant），在顯示代數中，行列式是一個值，一個數值可以告訴我們一個矩陣是否是奇異的。對於每一個$n\\times n$的矩陣$A$，據對應一個標量$det(A)$，它的值將告訴我們矩陣是否為非奇異的。\n",
    "<br>\n",
    "1. $2\\times 2$ 矩陣的行列式值\n",
    "<br>\n",
    "$det(\\   \n",
    "\\left[\\begin{array}{cc}   \n",
    "    a & b\\\\   \n",
    "    c & d\\\\      \n",
    "\\end{array}\\right]   \n",
    "\\  ) = ad - bc$<br>\n",
    "我們也可以用`sympy`進行核對："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a*d - b*c\n",
      "a*d - b*c\n"
     ]
    }
   ],
   "source": [
    "from sympy import *\n",
    "   \n",
    "a,b,c,d = symbols(\"a,b,c,d\")\n",
    "M1=Matrix([[a, b], [c, d]])\n",
    "print(M1.det())# print the determinant of matrix M1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 行列式的幾何意義：二維和三維歐式空間中的例子\n",
    "\n",
    "行列式的一個自然的怨氣就是$n$維平行體的體積。行列式的定義和$n$維平行體的體積有著本質上的關聯。<br>\n",
    "在二維空間中，行列式如上面例子所示；比如說：$det(A,B) =\\   \n",
    "\\left|\\begin{array}{cc}   \n",
    "    2 & 3\\\\   \n",
    "    1 & 4\\\\      \n",
    "\\end{array}\\right|   \n",
    "\\ = 2\\bullet 4 - 3\\bullet 1 = 5$，我們經過計算可以知道，當係數是實數的時候，行列式表示的就是向量$\\vec A$和$\\vec B$ 形成的平行四邊形的**有向面積**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x6ebe3c30>,\n",
       " <matplotlib.lines.Line2D at 0x6ebe3cf0>,\n",
       " <matplotlib.lines.Line2D at 0x6ebe84d0>,\n",
       " <matplotlib.lines.Line2D at 0x6ebe8b90>]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x6ebe3c30>,\n",
       " <matplotlib.lines.Line2D at 0x6ebe3cf0>,\n",
       " <matplotlib.lines.Line2D at 0x6ebe84d0>,\n",
       " <matplotlib.lines.Line2D at 0x6ebe8b90>]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x6ec5dc30>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x6ec5dc30>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from pylab import *\n",
    "\n",
    "plt.plot([0,2],[0,1],'blue',[3,5],[4,5],'blue',[0,3],[0,4],'red',[2,5],[1,5],'red')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5.0\n",
      "5.0\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "   \n",
    "a = np.matrix([[2,1],[3,4]])\n",
    "print(np.linalg.det(a))# print the determinant of matrix M1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我們通過計算，可以得到這個矩陣的行列式等於$5$，可以看出，上圖由紅線和藍線形成的是一個平行四邊形，我們可以通過計算得出，它的面積等於$5$<br>\n",
    "*這裡只是簡單介紹二維行列式，具體請查閱課本**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "那如果是三位空間呢？在三維的有向空間中，三個三維向量的行列式是$\\left|\\begin{array}{ccc}   \n",
    "    x & x' & x''\\\\   \n",
    "    y & y' & z''\\\\\n",
    "    z & z' & z''\n",
    "\\end{array}\\right|  \n",
    "\\ = xy'z'' + x'y''z + x''yz' - xy''z' - xyz'' - x''y'z $\n",
    "<br>\n",
    "比如說，三個向量$(2,1,5),(6,0,8)$ 和 $(3,2,4)$ 的行列式為：\n",
    "$\\left|\\begin{array}{ccc}   \n",
    "    2 & 6 & 3\\\\   \n",
    "    1 & 0 & 2\\\\\n",
    "    5 & 8 & 4\n",
    "\\end{array}\\right| = 28\n",
    "$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x6ebb3e70>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x6ebb3e70>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from mpl_toolkits.mplot3d import Axes3D\n",
    "\n",
    "p0 = [2, 1,5]\n",
    "p1 = [6,0,8]\n",
    "p2 = [3,2,4]\n",
    "\n",
    "origin = [0,0,0]\n",
    "X, Y, Z = zip([0,0,0],origin,origin) \n",
    "U, V, W = zip(p0,p1,p2)\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111, projection='3d')\n",
    "ax.quiver(X,Y,Z,U,V,W,arrow_length_ratio=0.001)\n",
    "ax.set_xlim([-1, 5])\n",
    "ax.set_ylim([-1, 5])\n",
    "ax.set_zlim([-1, 8])\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "類比一下二維向量的行列式，我們可以猜測一下三維向量組的行列式的幾何意義，就是這三個向量行程的平行六面體的**有向體積**<br>；我們可以用`python`來算它的行列式："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "28.0\n",
      "28.0\n"
     ]
    }
   ],
   "source": [
    "a = np.matrix([[2,1,5],[6,0,8],[3,2,4]])\n",
    "print(np.linalg.det(a))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "***特別的，如果向量組中，所有向量共線或者共面（線性相關），面積或體積為零**，什麼是線性相關，我們會在後面解釋*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Chapter Three Vector\n",
    "\n",
    "### What is Vector\n",
    "\n",
    "在初中（或高中）物理，我們就已經接觸過向量了，那向量到底是什麼？它是指一個同事具有大小和方向，且滿足平行四邊形法則的集合對象。一般地，同時滿足具有大小和方向兩個性質的集合對象就可以稱作為向量（物理中的電流：有方向，有大小，但是它不是向量，這是特殊情況，我們在線性代數中不討論）。與向量相對的叫做**標量**（scalar），一般標量和向量最大的區別就是是否有向。<br>\n",
    "在$R^n$空間中定義$\\vec V$，可以用一個包含$n$個實數的有序集來表示：$\\vec V = \\begin{bmatrix} v_1 \\\\ v_2 \\\\ \\dots \\\\ v_n\\end{bmatrix}$，這個有序集中的每一個元素被稱為向量的分量（在某一維度的量）。例如，一個在$R^2$空間的向量$\\begin{bmatrix} 2 \\\\ 1 \\end{bmatrix}$,我們也可以用$(2,1)$或$<2,1>$來表示："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW4AAAD8CAYAAABXe05zAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAELBJREFUeJzt3VtwVWWah/H/awinAOIhKANSQCFQCoU4kdFCUSONIMewctFd1V7NFDfTU3aNZdf0ldWlF3PV9lwOijWO3dNWVxbnk4AYAVExocHh0HgCHUAMiAqpaA7knQu2G+NO2AvdOytf9vOrSpHt95F6a5U+tWplraW5uwAA4bgu7QEAANeGcANAYAg3AASGcANAYAg3AASGcANAYAYk2WRmJyRdlHRJUoe7VxVzKABAzxKFO+Nhdz9XtEkAAIlwqQQAAmNJnpw0s+OSvpTkkv7T3Vd2s2eFpBWSVFFR8fdTp04t8KgA0H81Njaec/fKJHuThvvv3P20mY2StF3Sv7j7rp72V1VVeUNDQ+KBAaDUmVlj0t8fJrpU4u6nM382SVojadaPHw8A8FPkDbeZVZjZ8O++lzRP0qFiDwYA6F6Su0pukbTGzL7b/z/uvrWoUwEAepQ33O7+saQZvTALACABbgcEgMAQbgAIDOEGgMAQbgAIDOEGgMAQbgAIDOEGgMAQbgAIDOEGgMAQbgAIDOEGgMAQbgAIDOEGgMAQbgAIDOEGgMAQbgAIDOEGgMAQbgAIDOEGgMAQbgAIDOEGgMAQbgAIDOEGgMAQbgAIDOEGgMAQbgAIDOEGgMAQbgAIDOEGgMAQbgAIDOEGgMAQbgAIDOEGgMAQbgAIDOEGgMAkDreZlZnZX81sYzEHAgBc3bWccT8h6WixBgEAJJMo3GY2VtJCSS8UdxwAQD5Jz7j/IOk3kjp72mBmK8yswcwazp49W5DhAAC58obbzBZJanL3xqvtc/eV7l7l7lWVlZUFGxAA0FWSM+7ZkpaY2QlJr0iqNrM/FnUqAECP8obb3X/r7mPdfbykn0va6e6/LPpkAIBucR83AARmwLVsdvd6SfVFmQQAkAhn3AAQGMINAIEh3AAQGMINAIEh3AAQGMINAIEh3AAQGMINAIEh3AAQGMINAIEh3AAQGMINAIEh3AAQGMINAIEh3AAQGMINAIEh3AAQGMINAIEh3AAQGMINAIEh3AAQGMINAIEh3AAQGMINAIEh3AAQGMINAIEh3AAQGMINAIEh3AAQGMINAIEh3AAQGMINAIEh3AAQGMINAIHJG24zG2xm+8zsoJkdNrPf9cZgAIDuDUiwp1VStbs3m1m5pD1mtsXd3y7ybACAbuQNt7u7pObMx/LMlxdzKABAzxJd4zazMjM7IKlJ0nZ3f6ebPSvMrMHMGs6ePVvoOQEAGYnC7e6X3P0uSWMlzTKzad3sWenuVe5eVVlZWeg5AQAZ13RXibt/Jale0vyiTAMAyCvJXSWVZjYy8/0QSXMl/a3YgwEAupfkrpLRkl4yszJdDv1f3H1jcccCAPQkyV0l70ma2QuzAAAS4MlJAAgM4QaAwBBuAAgM4QaAwBBuAAgM4QaAwBBuAAgM4QaAwBBuAAgM4QaAwBBuAAgM4QaAwBBuAAgM4QaAwBBuAAgM4QaAwBBuAAgM4QaAwBBuAAgM4QaAwBBuAAgM4QaAwBBuAAgM4QaAwBBuAAgM4QaAwBBuAAgM4QaAwBBuAAgM4QaAwBBuAAgM4QaAwBBuAAgM4QaAwBBuAAhM3nCb2W1m9rqZHTWzw2b2RG8MBgDo3oAEezokPenu+81suKRGM9vu7keKPBsAoBt5z7jd/TN335/5/qKko5LGFHswAED3rukat5mNlzRT0jvdrK0wswYzazh79mxhpgMA5EgcbjMbJimW9Gt3v/DDdXdf6e5V7l5VWVlZyBkBAN+TKNxmVq7L0f6Tu68u7kgAgKtJcleJSVol6ai7/774IwEAribJGfdsSY9LqjazA5mvx4o8FwCgB3lvB3T3PZKsF2YBACTAk5MAEBjCDQCBIdwAEBjCDQCBIdwAEBjCDQCBIdwAEBjCDQCBIdwAEBjCDQCBIdwAEBjCDQCBIdwAEBjCDQCBIdwAEBjCDQCBIdwAEBjCDQCBIdwAEBjCDQCBIdwAEBjCDQCBIdwAEBjCDQCBIdwAEBjCDQCBIdwAEBjCDQCBIdwAEBjCDQCBIdwAEBjCDQCBIdwAEBjCDQCByRtuM3vRzJrM7FBvDAQAuLokZ9z/JWl+kecAACSUN9zuvkvS+V6YBQCQwIBC/SAzWyFphSSNGzeuUD8WfdChQ4dUX1+vtrY2tbe3q62tLfv1/c/ffT9y5Eg9/fTTGjVqVNqjA/2CuXv+TWbjJW1092lJfmhVVZU3NDT8tMnQZ7W2tmr58uXavHlz3r1LlizR888/T7SBPMys0d2rkuzlrhJcs0GDBum5555TZWVlj3uGDRumVatWae3atUQbKLCCXSpB//fhhx8qjmPFcax33323x33333+/XnrpJU2cOLEXpwNKR95wm9mfJT0k6WYzOynpaXdfVezBkD5315EjR7Kxfu+99666v7y8XM8++6yefPJJlZWV9dKUQOnJG253/0VvDIK+wd114MABxXGsuro6HTt2LGfP7bffriiKFEWRqqurdfHiRU2fPl0vv/yyZsyYkcLUQGnhUgnU2dmpffv2Zc+sjx8/nrNn2rRp2VhPmzZNZqYzZ86oublZTz31lJ555hkNGjQohemB0kO4S9SlS5e0Z88exXGs1atX69SpUzl77r777mysp0yZkrN+4cIF1dfXa86cOb0xMoAMwl1C2tvbVV9frziOtWbNGjU1NeXsue+++xRFkZYvX64JEyZc9edNnjxZkydPLta4AHpAuPu51tZWbd++XXEca/369Tp/vutDsNddd50eeOAB1dbWqqamRmPGjElpUgBJEe5+qKWlRVu3blVdXZ02btyoixcvdlkfMGCAqqurFUWRli1bxn3WQGAIdz9x4cIFbdq0SXEca8uWLWppaemyPmjQIM2bN09RFGnx4sW68cYbU5oUwE9FuAN2/vx5rV+/XnEca9u2bWpra+uyPnToUC1YsEBRFGnhwoUaMWJESpMCKCTCHZimpiatXbtWcRxr586d6ujo6LI+fPhwLV68WFEUaf78+Ro6dGhKkwIoFsIdgFOnTmn16tWK41i7d+9WZ2dnl/UbbrhBy5YtUxRFmjt3LvdTA/0c4e6jjh8/nn0g5u23385ZHzVqlGpqahRFkR566CGVl5enMCWANBDuPuTYsWPZWO/fvz9nfezYsVq+fLmiKNLs2bN5HwhQogh3itxdhw4dUl1dneI41uHDh3P2TJgwQVEUqba2Vvfcc4+uu4438QKljnD3MndXY2Nj9sz6gw8+yNkzderU7KPmd911l8wshUkB9FWEuxd0dnbqrbfeyr4X5JNPPsnZM2PGjGys77jjjhSmBBAKwl0kHR0d2r17dzbWn332Wc6ee+65JxvrSZMmpTAlgBAR7gJqa2vTzp07Fcex1q5dq3PnznVZNzPNnj07+xIn/qfKAH4Mwv0TffPNN9q2bZviONaGDRv01VdfdVkvKyvTgw8+qCiKVFNTo9GjR6c0KYD+gnD/CM3NzdqyZYviONamTZvU3NzcZb28vFxz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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x6ebf0e30>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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VatWae3atUQbKLCCXSpB//fhhx8qjmPFcax33323x33333+/XnrpJU2cOLEXpwNKR95wm9mfJT0k6WYzOynpaXdfVezBkD5315EjR7Kxfu+99666v7y8XM8++6yefPJJlZWV9dKUQOnJG253/0VvDIK+wd114MABxXGsuro6HTt2LGfP7bffriiKFEWRqqurdfHiRU2fPl0vv/yyZsyYkcLUQGnhUgnU2dmpffv2Zc+sjx8/nrNn2rRp2VhPmzZNZqYzZ86oublZTz31lJ555hkNGjQohemB0kO4S9SlS5e0Z88exXGs1atX69SpUzl77r777mysp0yZkrN+4cIF1dfXa86cOb0xMoAMwl1C2tvbVV9frziOtWbNGjU1NeXsue+++xRFkZYvX64JEyZc9edNnjxZkydPLta4AHpAuPu51tZWbd++XXEca/369Tp/vutDsNddd50eeOAB1dbWqqamRmPGjElpUgBJEe5+qKWlRVu3blVdXZ02btyoixcvdlkfMGCAqqurFUWRli1bxn3WQGAIdz9x4cIFbdq0SXEca8uWLWppaemyPmjQIM2bN09RFGnx4sW68cYbU5oUwE9FuAN2/vx5rV+/XnEca9u2bWpra+uyPnToUC1YsEBRFGnhwoUaMWJESpMCKCTCHZimpiatXbtWcRxr586d6ujo6LI+fPhwLV68WFEUaf78+Ro6dGhKkwIoFsIdgFOnTmn16tWK41i7d+9WZ2dnl/UbbrhBy5YtUxRFmjt3LvdTA/0c4e6jjh8/nn0g5u23385ZHzVqlGpqahRFkR566CGVl5enMCWANBDuPuTYsWPZWO/fvz9nfezYsVq+fLmiKNLs2bN5HwhQogh3itxdhw4dUl1dneI41uHDh3P2TJgwQVEUqba2Vvfcc4+uu4438QKljnD3MndXY2Nj9sz6gw8+yNkzderU7KPmd911l8wshUkB9FWEuxd0dnbqrbfeyr4X5JNPPsnZM2PGjGys77jjjhSmBBAKwl0kHR0d2r17dzbWn332Wc6ee+65JxvrSZMmpTAlgBAR7gJqa2vTzp07Fcex1q5dq3PnznVZNzPNnj07+xIn/qfKAH4Mwv0TffPNN9q2bZviONaGDRv01VdfdVkvKyvTgw8+qCiKVFNTo9GjR6c0KYD+gnD/CM3NzdqyZYviONamTZvU3NzcZb28vFxz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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x6ebf0e30>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "soa = np.array([[0, 0, 2, 1]])\n",
    "X, Y, U, V = zip(*soa)\n",
    "plt.figure()\n",
    "ax = plt.gca()\n",
    "ax.quiver(X, Y, U, V, angles='xy', scale_units='xy', scale=1)\n",
    "ax.set_xlim([0, 5])\n",
    "ax.set_ylim([0, 5])\n",
    "plt.draw()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "向量的長度被定義為$\\parallel v \\parallel = \\sqrt{v_1^2 + v_2^2 +\\dots + v_n^2}$；當然的，當$\\parallel v \\parallel = 1$，我們稱這個向量是**單位向量**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 基本運算\n",
    "\n",
    "#### 加法\n",
    "\n",
    "向量$a$和向量$b$的加法定義為：$\\mathbf{a} + \\mathbf{b} = \\begin{bmatrix} a_1 + b_2 \\\\ a_2 + b_2 \\\\ \\dots \\\\a_n + b_n \\end{bmatrix}$<br>\n",
    "下面通過畫圖來示意向量$\\mathbf{a} = \\begin{bmatrix} -1 \\\\ 2 \\end{bmatrix}$與$\\mathbf{b} = \\begin{bmatrix}3 \\\\ 1\\end{bmatrix}$相加，等於$\\begin{bmatrix} 2 \\\\ 3 \\end{bmatrix}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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mcmWLVucqZXVq1dz8uTJXLe95pprnKmVqKgo57Z+kYtRsQeAa665hqeeeoqRI0eyZ88exo4dW2IeWfbjjz/SrVs3p5xefvllrr/+eo9TlRxZWVls27bNmVpZtWoVx48fz3Xbq666yinxqKgoLbkgBaapmACRlZVFp06dWLt2LQArVqygU6dOnmY6evQokZGR7Ny5E4Dp06fz0EMPeZrJa9nZ2SQnJztTKytXruTYsWO5blunTh1naiUqKoorr7yymNNKoNFUjM8EBwezYMECrrvuOlJTU4mLiyM5OZly5cp5kictLY0+ffo4pf7AAw8watQoT7J4KTs7m+3btztTKytWrODo0aO5blu7dm2nxKOjo6lbt65OXkqRULEHkGuvvZaJEycSHx/P999/z6OPPsqMGTOKPUd2djYDBgxg5cqVQM7zW5999tlSUVLWWnbs2OFMrSxfvtx5vN8fXX755eeMyK+++upS8Xck3tNUTIDJysqiQ4cObNiwAWMMq1evpkOHDsWaIT4+nmnTpgHQvn17Pv30U8LDw4s1Q3Gx1vL11187I/Lly5f/6YNQatSo4YzGo6OjqVevnopcXKWpGJ8KDg4mISGBFi1akJ6eTlxcHFu3bi22Yn3++eedUq9Xrx5LlizxValba/n222/PGZH/2UPGq1Wr5pzojI6OpkGDBipyKRFU7AGoUaNGPP7444wbN45du3Yxfvx4pkyZUuTHfeeddxg+fDiQU2qJiYlceumlRX7comStZffu3c7JzuXLl3PgwIFct61ateo5lx82btxYRS4lkqZiAlRGRgZt27Zl69atBAUFsW7dOtq0aVNkx/v888+Jjo4mNTWV8PBwli9fXqTHK0o//PDDOVMrP/30U67bValShc6dOztTK02aNNHzWcVTmorxudDQUBISEoiIiCAzM5PY2Fi2bNlSJM8Q/e677+jZs6fzeLQ33ngjoEp97969ToknJSXxZ49lrFy5Mp06dXJG5c2aNSM4OLiY04oUnoo9gDVv3pxx48YxYcIEduzYwRNPPMGkSZNcPcahQ4e45ZZbOHz4MJAzx96rVy9Xj+G2/fv3nzO1snv37ly3q1ixItdff70ztdKiRQsVufiCpmICXHp6Oq1btyY5OZng4GA2bNhAy5YtXdn36dOniY6OZsOGDQCMGTOGp59+2pV9u+nnn392RuNJSUl89913uW5Xvnx5rr/+emdE3rJlS0JCNLaRwKGpmFIiLCyMhIQE2rRpQ1ZWFrGxsWzcuJGwsLBC7TcrK4v+/fs7pX7nnXfy1FNPuRG50H755RfnipWkpCR27dqV63bh4eF07NjRGZFHREQQGhpazGlFip+K3QdatmzJmDFjeOqpp0hOTmby5Mk8/vjjBd6ftZYRI0bw7rvvAhAVFUVCQoJnJw4PHTrEihUrnKmVHTt25Lpd2bJl6dChg3Oys3Xr1oX+AScSiDQV4xNpaWm0bNmSHTt2EBISwubNm2nWrFmB9jVt2jTi4+MBaNy4MatXr6ZKlSpuxr2gI0eOsHLlSmdqZfv27bluV6ZMGdq3b+9MrbRt27ZITh6LlBSaiillypQpQ0JCAu3bt3eukvn888/zPfXw+uuvO6Ves2ZN3n///SIv9aNHj7Jy5UpnaiU5OZncBhyhoaG0a9fOmVpp166dr26OEnGLit1H2rRpw0MPPcS0adPYsmUL06dPZ+zYsXl+/YoVK7j33nsBqFChAsuWLaNOnTqu5zx27BirVq1yRuTbtm3LtchDQkJo27atMyJv3769Z4ueiQQSTcX4TEpKCtdddx3ffPMNYWFhbN26lUaNGl30dTt27CAyMpLffvuNkJAQli1bxs033+xKphMnTrBq1SpnRL5lyxays7PP2y44OJjWrVs7RR4ZGUn58uVdySDiB5qKKaXCw8NJSEigY8eOzloya9asueD12QcOHCAmJobffvsNgLlz5xaq1E+ePMmaNWuck52bNm0iKyvrvO2CgoJo1aqVM7XSsWNHKlasWODjikgOFbsPdejQgREjRvDcc8+xfv16nn32WR5++OFctz1x4gTdu3dn7969AEyYMMGZjsmr06dPs3btWmdqZePGjWRmZp63nTGGFi1aOFetXH/99VSqVCnf35+IXJimYnzq9OnTNGvWjO+//56yZcvyxRdfUL9+/XO2ycjIoEePHnz00UcADBw4kLlz5150YauUlBTWrVvnTK2sX7+ejIyM87YzxtC8eXNnRN6pU6divbpGxG80FVPKlStXjvnz5xMVFeU8cWnFihXOlIy1lqFDhzql3rVrV1588cVcSz0tLY3PP//cmVpZt24d6enpuR63adOmzoi8U6dOVK1atei+SRHJlYrdxzp37sz999/P7NmzWbNmDc8//zwjRowAYOLEiSQkJADQokUL/v3vfzuXRqanp7NhwwZnamXdunWkpqbmeozGjRs7Jzs7d+4c8Mv4iviBK1MxxphbgH8CwcA8a+0FFxTRVEzxOXnyJE2aNOHHH38kPDycL7/8kpUrVxIXFwfAlVdeycqVK9m3b58zIl+zZg0pKSm57q9BgwbO1EpUVBTVq1cvzm9HpFQrtqkYY0wwMBu4CdgHbDTGLLHW5n7ftxSrChUqMG9PeqTeAAAF0ElEQVTePG666SZSUlLo27evc0t+2bJlqVWrFo0aNeLUqVO5vr5evXrO1Ernzp25/PLLizO+iBSAG1MxbYDvrLW7AYwxbwC9ARV7CXHjjTcyePBg5s6dy5dfful8PjU1lbVr156z7dVXX33OU4Jq1apV3HFFpJDcKPZawO8fQbMPaOvCfsVF06ZNIzExEWPMOU8Mqlu3rjMij4qK4oorrvAwpYi4wY1iz+3auPMm7o0xQ4AhQJHcpi4XVrlyZb744guOHDnC6NGj6dOnD1FRUdStW9fraCLiMjeKfR/w+2FebeC8pwFba+cAcyDn5KkLx5V8qlq1KlWrVuWdd97xOoqIFCE3FtjeCNQzxlxljAkD7gCWuLBfEREpgEKP2K21mcaYYcCH5FzuuMBa+1Whk4mISIG4coOStfZ94H039iUiIoXjzbPORESkyKjYRUR8RsUuIuIzKnYREZ9RsYuI+IyKXUTEZ1TsIiI+o2IXEfEZFbuIiM+o2EVEfEbFLiLiMyp2ERGfUbGLiPiMil1ExGdU7CIiPqNiFxHxGRW7iIjPqNhFRHxGxS4i4jMqdhERn1Gxi4j4jIpdRMRnVOwiIj6jYhcR8RkVu4iIz6jYRUR8RsUuIuIzKnYREZ8pVLEbY/oZY74yxmQbYyLcCiUiIgVX2BH7duBWYKULWURExAUhhXmxtXYngDHGnTQiIlJohSr2/DDGDAGGnPkwzRizvbiOXQQuBQ57HaIQAjl/IGcH5fdaoOe/Ni8bXbTYjTGfAJfl8qVx1tp385rGWjsHmHNmn5ustQE7J6/83gnk7KD8XvND/rxsd9Fit9beWPg4IiJSXHS5o4iIzxT2cse+xph9QHtgmTHmwzy+dE5hjlsCKL93Ajk7KL/XSkV+Y60t6iAiIlKMNBUjIuIzKnYREZ/xrNiNMdOMMV8bY5KNMYuNMVW8ylIQgbicgjHmFmPMLmPMd8aYR7zOkx/GmAXGmIOBev+DMeYKY0ySMWbnmX83I7zOlB/GmLLGmA3GmC/O5J/gdab8MsYEG2O2GmOWep0lv4wxe4wxXxpjtuXlkkcvR+wfA02stc2Ab4CxHmYpiIBaTsEYEwzMBmKARsCdxphG3qbKl4XALV6HKIRM4CFrbUOgHXB/gP39pwE3WGubA9cBtxhj2nmcKb9GADu9DlEI0dba6/JyHb5nxW6t/cham3nmw8+B2l5lKQhr7U5r7S6vc+RDG+A7a+1ua2068AbQ2+NMeWatXQn86nWOgrLW/myt3XLm/RPkFEwtb1Plnc1x8syHoWfeAubKC2NMbaA7MM/rLMWhpMyxxwGJXofwuVrAT7/7eB8BVCx+YoypC7QA1nubJH/OTGVsAw4CH1trAyn/c0A8kO11kAKywEfGmM1nlme5oCJdKyYvyxEYY8aR82vqq0WZpSDcWk6hhMhtpbaAGXH5hTGmAvA28KC19rjXefLDWpsFXHfmfNhiY0wTa22JP+dhjOkBHLTWbjbGRHmdp4AirbUHjDHVgY+NMV+f+S02V0Va7BdbjsAYMwDoAXSxJfCCep8tp7APuOJ3H9cGDniUpVQyxoSSU+qvWmsXeZ2noKy1vxljlpNzzqPEFzsQCfQyxnQDygKVjDGvWGvv8jhXnllrD5z586AxZjE5U6t/WuxeXhVzCzAG6GWtPe1VjlJkI1DPGHOVMSYMuANY4nGmUsPkrG09H9hprZ3hdZ78MsZUO3vlmjEmHLgR+NrbVHljrR1rra1tra1Lzr/7zwKp1I0x5Y0xFc++D9zMRX6gejnH/jxQkZxfK7YZY17yMEu+FWI5BU+cOVE9DPiQnBN3b1lrv/I2Vd4ZY14H1gHXGmP2GWMGep0pnyKBu4Ebzvx733ZmBBkoLgeSjDHJ5AwSPrbWBtxlgwGqBrDaGPMFsAFYZq394EIv0JICIiI+U1KuihEREZeo2EVEfEbFLiLiMyp2ERGfUbGLiPiMil1ExGdU7CIiPvP/ABvwk3SKhN5WAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x6f5b3410>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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mcmWLVucqZXVq1dz8uTJXLe95pprnKmVqKgo57Z+kYtRsQeAa665hqeeeoqRI0eyZ88exo4dW2IeWfbjjz/SrVs3p5xefvllrr/+eo9TlRxZWVls27bNmVpZtWoVx48fz3Xbq666yinxqKgoLbkgBaapmACRlZVFp06dWLt2LQArVqygU6dOnmY6evQokZGR7Ny5E4Dp06fz0EMPeZrJa9nZ2SQnJztTKytXruTYsWO5blunTh1naiUqKoorr7yymNNKoNFUjM8EBwezYMECrrvuOlJTU4mLiyM5OZly5cp5kictLY0+ffo4pf7AAw8watQoT7J4KTs7m+3btztTKytWrODo0aO5blu7dm2nxKOjo6lbt65OXkqRULEHkGuvvZaJEycSHx/P999/z6OPPsqMGTOKPUd2djYDBgxg5cqVQM7zW5999tlSUVLWWnbs2OFMrSxfvtx5vN8fXX755eeMyK+++upS8Xck3tNUTIDJysqiQ4cObNiwAWMMq1evpkOHDsWaIT4+nmnTpgHQvn17Pv30U8LDw4s1Q3Gx1vL11187I/Lly5f/6YNQatSo4YzGo6OjqVevnopcXKWpGJ8KDg4mISGBFi1akJ6eTlxcHFu3bi22Yn3++eedUq9Xrx5LlizxValba/n222/PGZH/2UPGq1Wr5pzojI6OpkGDBipyKRFU7AGoUaNGPP7444wbN45du3Yxfvx4pkyZUuTHfeeddxg+fDiQU2qJiYlceumlRX7comStZffu3c7JzuXLl3PgwIFct61ateo5lx82btxYRS4lkqZiAlRGRgZt27Zl69atBAUFsW7dOtq0aVNkx/v888+Jjo4mNTWV8PBwli9fXqTHK0o//PDDOVMrP/30U67bValShc6dOztTK02aNNHzWcVTmorxudDQUBISEoiIiCAzM5PY2Fi2bNlSJM8Q/e677+jZs6fzeLQ33ngjoEp97969ToknJSXxZ49lrFy5Mp06dXJG5c2aNSM4OLiY04oUnoo9gDVv3pxx48YxYcIEduzYwRNPPMGkSZNcPcahQ4e45ZZbOHz4MJAzx96rVy9Xj+G2/fv3nzO1snv37ly3q1ixItdff70ztdKiRQsVufiCpmICXHp6Oq1btyY5OZng4GA2bNhAy5YtXdn36dOniY6OZsOGDQCMGTOGp59+2pV9u+nnn392RuNJSUl8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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x6f5b3410>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "soa = np.array([[0, 0, -1, 2], [0, 0, 3, 1], [0, 0, 2, 3],[3,1,-1,2]])\n",
    "X, Y, U, V = zip(*soa)\n",
    "plt.figure()\n",
    "ax = plt.gca()\n",
    "ax.quiver(X, Y, U, V, angles='xy', scale_units='xy', scale=1)\n",
    "ax.set_xlim([-2, 5])\n",
    "ax.set_ylim([-1, 5])\n",
    "plt.draw()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看出，向量的加法是遵從平行四邊形法則的，在`python`中，我們可以直接用`numpy`的`ndarray`來表示向量："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2 3]\n",
      "[2 3]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "a = np.array([-1,2])\n",
    "b = np.array([3,1])\n",
    "print(a+b)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 減法\n",
    "\n",
    "了解了加法了，減法就相當於加了一個反方向的向量，$\\mathbf{a} - \\mathbf{b} = \\begin{bmatrix} a_1 - b_1 \\\\ a_2 - b_2 \\\\ \\ldots \\\\ a_n - b_n \\end{bmatrix}$，下面通過畫圖來示意向量$\\mathbf{a} = \\begin{bmatrix} -1 \\\\ 2 \\end{bmatrix}$與$\\mathbf{b} = \\begin{bmatrix}3 \\\\ 1\\end{bmatrix}$相減，等於$\\begin{bmatrix} -4 \\\\ 1 \\end{bmatrix}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x6ec3c670>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAD8CAYAAABjAo9vAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtUVWX+P/D3h4uKeFfUHCRLEVFEQRTyUpkahlOzdMaymi4rJ21NU86YWqalaY6lFVHf8peT1TQ16Yx97eIX85amY8lNgUBu5qVMTchLiAoCn98f4B6PcAA5h7PP2bxfa7GWB56zzxuVt4/P2fvZoqogIiLr8DI7ABEROReLnYjIYljsREQWw2InIrIYFjsRkcWw2ImILMbhYheRViKSLCIZIpItIs85IxgRETWOOHoeu4gIAH9VPSsivgD+A2CGqu52RkAiIro6Po4eQKv+ZThb/dC3+oNXPRERmcThYgcAEfEGkAagD4A3VDWpljHTAEwDAH9//yH9+vVzxksTETUbaWlpRaoaUN84h5dibA4m0gHAOgCPqWqWvXFRUVGamprqtNclImoORCRNVaPqG+fUs2JU9TSA7QDGO/O4RETUcM44KyageqYOEfEDMBZArqPHJSKixnHGGvs1AP5evc7uBeBfqrreCcclIqJGcMZZMZkAIpyQhYiInIBXnhIRWQyLnYjIYljsREQWw2InIrIYFjsRkcWw2ImILIbFTkRkMSx2IiKLYbETEVkMi52IyGJY7EREFsNiJyKyGBY7EZHFsNiJiCyGxU5EZDEsdiIii2GxExFZDIudiMhiWOxERBbDYicishgWOxGRxbDYiYgshsVORGQxLHYiIothsRMRWQyLnYjIYljsREQW43Cxi0hPEdkmIjkiki0iM5wRjIiIGsfHCccoB/CEqu4RkbYA0kRks6ruc8KxiYjoKjk8Y1fVY6q6p/rXxQByAPzK0eMSEVHjOHWNXUR6AYgAkOTM4xK5yqlTp8yOQOQwpxW7iLQB8DGAP6vqL7V8fZqIpIpIamFhobNelsipPvroI/z73/82OwaRQ5xS7CLii6pS/1BV/7e2Maq6UlWjVDUqICDAGS9L5HTDhg3DlClT8O6775odhajRnHFWjABYBSBHVV9xPBKReQYPHgw/Pz889NBDSEhIMDsOUaM4Y8Y+AsB9AG4RkfTqjzgnHJfI5Xx8fHDDDTcAAP785z9j8eLFUFWTUxFdHWecFfMfVRVVDVfVwdUfic4IR2SGUaNGGb9+9tlnMXv2bJY7eRReeUp0hZEjR9o8fvnllzF9+nRUVFSYlIjo6rDYia4QHR0NHx/ba/f+9re/4d5778XFixdNSkXUcCx2oiv4+/sjMjKyxufXrFmDiRMn4vz58yakImo4FjtRLS5fZ79k+PDhaNWqFdauXWtCIqKGY7ET1eLKdXYAuOWWW7B27Vrcd999JiQiajgWO1EtRowYAQB4+OGHMWTIEADA8uXLcejQIRNTETUMi52oFgEBAYiNjcVLL72EV199FQBQWlqK2bNnm5yMqH4sdiI71qxZg3bt2mHkyJGYMmUKAGDt2rXYvn27ucGI6sFiJ7Kjffv2xq9ffPFF+Pn5Aai6IpXntJM7Y7ETNUBQUBCefPJJAEBGRgZWrVplciIi+1jsRA00e/Zs9OzZEwAwb948nD592uRERLVjsRM1UOvWrbFs2TIAQFFRERYtWmRyIqLasdiJrsJdd91lnAr5+uuvIzc31+RERDWx2ImugoggISEBIoLy8nLMnDnT7EhENbDYia7SkCFD8NBDDwEANmzYgMRE7lJN7oXFTtQIS5YsQdu2bQEAM2fORFlZmcmJiP6LxU7UCN26dcMzzzwDAMjLy8Mbb7xhciKi/2KxEzXS448/jj59+gAAnnvuOZw4ccLkRERVWOxEjdSyZUu88krV/dvPnDljzOCJzMZiJ3LAr3/9a9x6660Aqu6ylJ6ebnIiIhY7kUNEBPHx8fD29oaqYsaMGbzxNZmOxU7koP79++PRRx8FAOzYsQMff/yxyYmouWOxEznBggUL0KlTJwDArFmzeF9UMhWLncgJOnXqhMWLFwMADh8+jJdfftnkRNScsdiJnGTatGkICwsDACxduhRHjhwxORE1Vyx2Iifx8fExbqN37tw5PPXUUyYnouaKxU7kRGPGjMHEiRMBAB9++CG++eYbkxNRc8RiJ3Kyl156CS1atAAAzJgxA5WVlSYnoubGKcUuIu+IyAkRyXLG8Yg82fXXX29s55uSkoJ//OMfJiei5sZZM/b3AIx30rE8TkVFBYqKivD999+bHYXcxNNPP43u3bsDAJ566ikUFxebnIiaEx9nHERVd4hIL2ccy12UlpYiPT0dhYWFKCoqqvPj5MmTUFV8/PHHCAoKMjs6uYG2bdvihRdewIMPPojjx4/jr3/9K5YuXWp2LGomxFmXP1cX+3pVDbPz9WkApgFAUFDQkMOHDzvldZvKmTNn8MQTTyArKwtJSUn1jp8/f75xHjMRAFRWViImJgYpKSlo0aIF9u3bh969e5sdizyYiKSpalR941z25qmqrlTVKFWNCggIcNXLNlr79u2RlpaGmJgYrFmzBtdff32d49966y3cfvvtWLJkCbZs2YIzZ864KCm5Ky8vLyQkJAAAysrKMHv2bJMTUXPBs2LqMHLkSCQkJGDjxo3IysrCq6++alw2fqXCwkKsX78e8+fPx7hx49CxY0cMGDAAU6dOxcqVK5GRkYHy8nIXfwdkthtuuAH33nsvAGDdunXYunWryYmoOXDZUszloqKiNDU11Smv25T+9a9/4a677gIATJ48GR988AFKSkqwdOlSJCQkGLdDGzBgAMLCwpCUlIRDhw7ZPZ6/vz+ioqIQExOD6OhoREdHo0ePHq74VshER44cQUhICM6dO4ewsDDs3bsXPj5OeXuLmpmGLsVAVR3+APARgGMALgI4AmBqXeOHDBminuDHH39UAMbHbbfdpiUlJaqqevDgQb3nnnsUgIaEhBjPOX78uH766ac6d+5cveWWW7RNmzY2x7jyo2fPnvq73/1OX3rpJd25c6dxfLKWxYsXG3/mb7zxhtlxyEMBSNUGdLLTZuxXw1Nm7ADQu3dvHDhwwHh844034vPPP0e7du0AAKmpqZg1axb++c9/1jr7rqioQE5ODpKSkrB7924kJSUhKyvL7p7dPj4+CA8PR3R0tDGzDw4OhpcXV8082fnz5xEaGorDhw+jU6dOKCgosLusR2RPQ2fsLPZ6PPDAA3j//fdtPhcVFYUNGzagS5cuAKr+13Px4kXjasP6FBcXIzU11Sj63bt346effrI7vmPHjhg2bJhR9sOGDUPnzp0b/02RKdauXYvJkycDAB577DG89tprJiciT8Nid5K3334bDz/8cI3P9+/fH5s3b3bKGrmq4vvvv7eZ1aelpaG0tNTuc4KDg21m9eHh4Q3+h4XMoaq4+eabsWPHDnh7eyMzMxP9+/c3OxZ5EBa7k+Tm5iI0NNTmcyKCdu3aITIyEuvWrUP79u2d/rplZWXIzMy0KfuCggK741u2bIkhQ4bYlH1QUBBExOnZqPHS09MRGRkJVcW4ceOwceNG/hlRg7HYnURV0bVrVxQVFRmfCw8PR1pamsvPbPj555+RnJxsU/anT5+2O7579+7G2TcxMTGIiopC27ZtXZiYajN9+nSsXLkSAPDZZ5/h9ttvNzkReQoWuxNNnDgRn332GSZNmoS1a9cCAFasWIFHHnnE1FyVlZUoKCiwKfrMzEy758t7eXlhwIABNmUfGhoKb29vFydv3goLCxEcHIwzZ86gT58+yMrKQsuWLc2ORR6Axe5Er7zyCo4fP46FCxeiX79++OGHH9C5c2cUFBSgY8eOZsezce7cOezZs8em7H/44Qe749u0aWO8MXvp49LmVdR04uPjjR0gly1bxqtSqUFY7E508OBBdO/eHX5+fli9ejXuvvtuAFV7bV+6Y447O3r0KJKSkoyyT01NRUlJid3x1157rbFOHxMTg4iICLRq1cqFia2vrKwMAwcORH5+Ptq2bYuCggJ069bN7Fjk5ljsTURVMWrUKOzatQs+Pj7IzMys8eaquysvL0d2drbNrD4nJ8fuufW+vr4YNGiQTdn37t2bb/o5KDExERMmTAAATJ06FW+//bbJicjdsdibUFpaGoYOHQpVRWxsLDZs2ODxJXfmzBmkpKTYlH1hYaHd8Z07d7ZZvhk2bJjbLUt5gri4OOPvT0pKCoYMGWJ2JHJjLPYm9oc//AGrVq0CAKxfv96YeVmFquLgwYM2Szh79+419sepTUhIiM0+OAMHDoSvr68LU3ue3NxcDBw4EOXl5RgxYgR27tzp8ZMEajos9ib2008/ITg4GMXFxQgODkZWVpblLxC6dPORy8v+8u0WruTn54chQ4bYLOEEBga6MLFnmDlzJuLj4wEAH330EaZMmWJyInJXLHYXWL58OebMmQOg6gbGTzzxhMmJXK+wsNCm6JOTk/HLL7/YHd+jRw+bi6iioqLg7+/vwsTu5/Tp0wgODkZRURECAwORl5eH1q1bmx2L3BCL3QVKS0sRFhaG/fv3o127digoKEDXrl3NjmWqyspK5Obm2pT9t99+i8rKylrHe3t7IywszGYJp1+/fs1u07O33nrLuC5i4cKFWLBggcmJyB2x2F3k888/xx133AEAePjhh40rCum/zp49i7S0NJuyP3r0qN3x7dq1s9n0LDo6Gp5w1y1HVFRUIDIyEpmZmfDz80Nubi7vn0s1sNhdRFUxfvx4bNq0CSKCtLQ0REREmB3L7R05csRmd8u0tDScP3/e7vjrr7/epugHDx5suas1t2/fjtGjRwMApkyZgo8++sjkRORuWOwutG/fPoSHh6OiogKjRo3CV199xTMbrtLFixeRlZVlU/Z5eXl2x7do0QIRERE2ZX/dddd5/O/75MmTjW0rduzYgVGjRpmciNwJi93FZsyYYeyvvWbNGtx5550mJ/J8p06dMjY9u1T2J0+etDs+ICDAZh+coUOHNsnOm03p0KFD6NevH0pLSxEREYGUlBTu5UMGFruLnTx5EsHBwTh58iSCgoKQm5sLPz8/s2NZiqriu+++M2b1SUlJ2Lt3r91Nz0QEoaGhNmU/YMAAt7/f6Pz587FkyRIAVfcDmDp1qsmJyF2w2E3w5ptv4tFHHwUALFq0CM8884zJiazvwoUL2Lt3r80SzuHDh+2Ob926NYYOHWqzhONuNxQ/e/YsQkJCcPToUXTt2hUFBQXGrRipeWOxm6C8vBwRERHIysqCn58f8vLy0LNnT7NjNTvHjx83ZvRJSUlITk7G2bNn7Y4PDAy0uYgqMjLS9PPIP/jgA9x3330AgNmzZ2PZsmWm5iH3wGI3ydatWzF27FgAwD333IMPP/zQ5ER06Ybil8/qs7Oz7W565u3tjfDwcJuyd/UNxSsrKzFixAjs3r0bvr6+yM7ORnBwsMten9wTi91EkyZNwrp16wAAu3btwvDhw01ORFe62huKd+jQwWbTs+jo6Ca/oXhycjKio6MBALfffjs+++yzJn09cn8sdhMdOHAAoaGhKCsrQ1RUFJKSkprdlZSepjE3FO/Tp4/NFbODBg1y+n5BDzzwAN5//30AwBdffIHY2FinHp88C4vdZHPnzsULL7wAAHj33Xfx4IMPmhuIrtqlG4pffhZOfTcUj4yMtFnCcfSG4kePHkXfvn1RUlKC0NBQZGRkcMfMZozFbrLi4mL07dsXx48fR7du3ZCfn88zGyzg0g3FLy/7um4o3q1bN5szcIYOHXrVNxRfunQpnn76aQDAa6+9hscee8yh74E8F4vdDfz97383ZupPPvmkMYMn66jthuIZGRmoqKiodbyIYMCAATZLOP3796/zIqQLFy6gf//+OHjwIDp06ICCggJ06dKlqb4lcmMsdjdQWVmJmJgYpKSkoEWLFsjOzkafPn3MjkVN7NINxS+f1dd3Q/GhQ4falP2VNxRft24dJk2aBAD44x//iDfeeKNJvwdyTy4tdhEZDyABgDeAt1W1zqlpcyl2APjmm2+Ms2J+85vf4JNPPjE5EZnh0g3FL5V9SkoKzp07Z3f8tddea7OEExERgQkTJmDbtm3w8vJCeno6Bg4c6MLvgNyBy4pdRLwB5AMYB+AIgBQAd6vqPnvPaU7FDgC///3vjfPZN2/ebJznTs1XY24o3rdvX2RnZwMAhg8fjv/85z8ev+kZXR1XFvsNABaqamz147kAoKpL7T2nuRX7kSNHEBISgnPnzmHAgAFIT093+/1KyPWu5obinTt3xrfffotrrrnGxSnJTA0tdmecXP0rAJcvIB6p/tyVgaaJSKqIpNr7y2pVgYGBmDt3LgAgOzsbb731lsmJyB21b98eY8eOxbx587BmzRq88847uPfee2t9o3ThwoUsdbLLGTP2yQBiVfUP1Y/vAzBMVe2ek9XcZuwAcP78eYSGhuLw4cPo2LEjCgoKmvzKRfIs+/fvR2JiIhITE7F9+/ZaL44KCgrC0KFDMX/+fAwePNiElGSmhs7YnbEecATA5TtdBQKwf9+zZsrPzw/Lly/HnXfeiVOnTmHhwoV4/fXXzY5FJrpw4QJ27NhhlHltFz/5+PjgxhtvxG233Ya4uDiEhoZyXZ3q5YwZuw+q3jwdA+BHVL15eo+qZtt7TnOcsQNVl63ffPPN2LFjB7y9vZGRkYEBAwaYHYtc6PDhw9iwYQMSExOxdevWWs+M6dGjB+Li4hAXF4cxY8bwwjYyuGzGrqrlIvInABtRdbrjO3WVenMmIkhISEBkZCQqKirwl7/8BRs3buQMzMLKysqwa9cuY1a+b1/Nk8W8vLwwfPhwo8zDw8P5d4IcwguUTDB9+nSsXLkSAPDpp5/ijjvuMDkROdPRo0eNWfnmzZtRXFxcY0zXrl2N5ZVx48ahY8eOJiQlT8MrT91YYWEhgoODcebMGfTu3RvZ2dlo2bKl2bGokcrLy7F7924kJiZiw4YNSE9PrzFGRDBs2DBjVh4ZGckdP+mqufLNU7pKAQEBWLBgAWbOnInvvvsOCQkJmDNnjtmx6CqcOHECX3zxBRITE7Fx48ZaNwLr2LEjxo8fj7i4OMTGxiIgIMCEpNQcccZukrKyMgwcOBD5+flo27Yt8vPza+wPQu6joqICqampxhJLSkpKreMiIyMRFxeH2267DdHR0XVu7kV0tThjd3MtWrRAfHw8JkyYgOLiYsybNw+rVq0yOxZd5ueff8amTZuQmJiIL774AkVFRTXGtGvXDrfeeivi4uIwfvx4XjREboEzdpPFxcVhw4YNEBEkJycjKqref4ypiagq0tPTjTNYdu/ejcrKyhrjwsLCjLXy4cOH88YX5DJ889RD5ObmYuDAgSgvL+fGTiY4c+YMtmzZYrzxeezYsRpj/P39MXbsWGOJpWfPnrUciajpcSnGQ/Tr1w+PPfYY4uPj8fXXX2P16tW4++67zY5lWaqK7OxsY1a+a9culJeX1xgXEhJizMpHjRrFs5bIo3DG7gZOnz6N4OBgFBUVITAwEHl5eWjdurXZsSzj7Nmz+PLLL40yr+2mF61atcLo0aONWXnv3r1NSEpUN87YPUiHDh3w/PPP45FHHsGRI0ewbNkyLFy40OxYHktVkZ+fbyyvfPXVVygrK6sx7rrrrsOECRMQFxeHm2++GX5+fiakJXI+ztjdREVFBSIjI5GZmYlWrVohLy8PQUFBZsfyGOfPn8f27duNWfmBAwdqjPH19cVNN91kLLH07duX72eQR+GM3cN4e3sjISEBo0ePxoULFzBnzhysXr3a7Fhu7cCBA8Z55V9++SUuXLhQY0xgYKBR5Lfccgvatm1rQlIi1+KM3c1MnjwZa9euBQDs2LEDo0aNMjmR+ygtLcXOnTuNWXleXl6NMd7e3hg5cqSxVh4WFsZZOVkGT3f0UIcOHUK/fv1QWlqKiIgIpKSkNOurF3/44QdjVr5lyxaUlJTUGNO9e3djQ62xY8eiQ4cOJiQlanpcivFQvXr1wqxZs7BkyRLs3bsX7733HqZOnWp2LJe5ePEivv76a6PMv/322xpjvLy8EB0dbSyxDB48mBtqEV2GM3Y3dPbsWYSEhODo0aPo2rUr8vPz0b59e7NjNZljx44ZG2pt2rQJv/zyS40xnTt3Nmblt956K28rSM0SZ+werE2bNnjxxRdx33334cSJE3j++eexfPlys2M5TUVFBZKTk4218j179tQ6LioqypiVR0VFNeslKaKrwRm7m6qsrMSIESOwe/du+Pr6IisrC3379jU7VqMVFhZi48aNxja3J0+erDGmffv2iI2NNTbU6tatmwlJidwXZ+wezsvLCwkJCYiOjsbFixfxxBNP4PPPPzc7VoNVVlZiz549xqw8OTkZtU0iBg0aZMzKY2Ji4OPDv5JEjuJPkRsbNmwY7r//frz//vtYv349Nm7ciNjYWLNj2XXq1Cls3rzZuOLzxIkTNca0adMG48aNM2blgYGBJiQlsjYuxbi5o0ePom/fvigpKUFoaCgyMjLcZptYVUVmZqYxK//mm29QUVFRY1xoaKgxKx85ciRatGhhQloiz8elGIvo0aMH5s2bh6effho5OTlYsWIFHn/8cdPyFBcX22xz++OPP9YY4+fnhzFjxhgXCfXq1cv1QYmaMc7YPcCFCxfQv39/HDx4EB06dEBBQQG6dOniktdWVeTk5Bjnle/cuRMXL16sMa53797Ghlo33XQTWrVq5ZJ8RM0JZ+wW0qpVK7z88suYNGkSTp8+jWeffRZvvvlmk71eSUkJtm3bZiyxHD58uMaYli1b2myoFRwc3GR5iOjqcMbuIVQVY8aMwbZt2+Dl5YX09HQMHDiwwc8/duwYvv76a/z2t7+t9ev79+83inz79u0oLS2tMSYoKMiYlY8ePRr+/v6N/n6I6Opxxm4xIoJXX30VERERqKysxIwZM7B169Z6N7hSVaxatQqzZs3CokWLjM9fuHABX331lbFWXlBQUOO5Pj4+GDVqlDErDw0N5YZaRB6Axe5BwsPDMX36dKxYsQLbtm3DJ598gokTJ9odv3//fkybNg3btm0DUHVDjxUrVhjb3J47d67Gc6655hqjyMeOHYt27do12fdDRE2DSzEepqioCMHBwTh9+jSuu+467Nu3r8YbleXl5YiPj8eCBQtw/vz5Oo/n5eWF4cOHG2UeHh7OWTmRm2roUoxDW+KJyGQRyRaRShGp98XIcV26dMFzzz0HADh48CDi4+Ntvp6eno6YmBjMmTPHbqkHBATg/vvvx+rVq1FYWIidO3di7ty5GDRoEEudyAIcmrGLSCiASgBvAZilqg2ahnPG7piLFy9i0KBByMnJgb+/P/Lz89GpUycsWrQIy5Ytq/UiIaBqdv7JJ59gwoQJ3OaWyAO5ZMauqjmqWvM2NtSkfH19jZl6SUkJnnrqKQwaNAhLly61W+pA1f4tzzzzTK3b4hKRdbjszVMRmQZgGgDepNkJYmNj8cADDyAiIgI9evTAhAkTUFlZiYqKClRUVNT564yMDNx0001mfwtE1ETqLXYR2QKgey1fmqeqnzb0hVR1JYCVQNVSTIMTkl3vvfee2RGIyA3VW+yqOtYVQYiIyDn4DhoRkcU4errjRBE5AuAGAP8nIhudE4uIiBrLoTdPVXUdgHVOykJERE7ApRgiIothsRMRWQyLnYjIYljsREQWw2InIrIYFjsRkcWw2ImILIbFTkRkMSx2IiKLYbETEVkMi52IyGJY7EREFsNiJyKyGBY7EZHFsNiJiCyGxU5EZDEsdiIii2GxExFZDIudiMhiWOxERBbDYicishgWOxGRxbDYiYgshsVORGQxLHYiIothsRMRWQyLnYjIYhwqdhFZLiK5IpIpIutEpIOzghERUeM4OmPfDCBMVcMB5AOY63gkIiJyhEPFrqqbVLW8+uFuAIGORyIiIkc4c439IQAbnHg8IiJqBJ/6BojIFgDda/nSPFX9tHrMPADlAD6s4zjTAEwDgKCgoEaFJSKi+tVb7Ko6tq6vi8gDAH4NYIyqah3HWQlgJQBERUXZHUdERI6pt9jrIiLjATwJ4CZVPeecSERE5AhH19j/B0BbAJtFJF1E/p8TMhERkQMcmrGrah9nBSEiIufgladERBbDYicishgWOxGRxbDYiYgshsVORGQxLHYiIothsRMRWQyLnYjIYljsREQWw2InIrIYFjsRkcWw2ImILIbFTkRkMSx2IiKLYbETEVkMi52IyGJY7EREFsNiJyKyGBY7EZHFsNiJiCyGxU5EZDEsdiIii2GxExFZDIudiMhiWOxERBbDYicishgWOxGRxbDYiYgsxqFiF5HFIpIpIukisklEejgrGBERNY6jM/blqhquqoMBrAfwrBMyERGRAxwqdlX95bKH/gDUsThEROQoH0cPICJLANwP4AyA0XWMmwZgWvXDUhHJcvS1XaALgCKzQzQAczqPJ2QEmNPZPCVnSEMGiWrdk2wR2QKgey1fmqeqn142bi6AVqq6oN4XFUlV1aiGBDQTczqXJ+T0hIwAczqb1XLWO2NX1bENfM1/Avg/APUWOxERNR1Hz4oJvuzhHQByHYtDRESOcnSN/QURCQFQCeAwgEca+LyVDr6uqzCnc3lCTk/ICDCns1kqZ71r7ERE5Fl45SkRkcWw2ImILMa0YheRhSLyY/V2BOkiEmdWloYQkVkioiLSxewsV/KUrR1EZLmI5FZnXSciHczOVBsRmSwi2SJSKSJudwqciIwXkTwR2S8iT5mdpzYi8o6InHDn61VEpKeIbBORnOo/7xlmZ6qNiLQSkWQRyajO+Vx9zzF7xh6vqoOrPxJNzmKXiPQEMA7A92ZnscNTtnbYDCBMVcMB5AOYa3Iee7IATAKww+wgVxIRbwBvALgNQH8Ad4tIf3NT1eo9AOPNDlGPcgBPqGoogBgAj7rp72UpgFtUdRCAwQDGi0hMXU8wu9g9RTyAOXDTLRM8ZWsHVd2kquXVD3cDCDQzjz2qmqOqeWbnsGMYgP2qekBVywCsBvAbkzPVoKo7AJw0O0ddVPWYqu6p/nVvzKN4AAACYUlEQVQxgBwAvzI3VU1a5Wz1Q9/qjzp/xs0u9j9V/7f8HRHpaHKWWonIHQB+VNUMs7PURUSWiMgPAO6F+87YL/cQgA1mh/BAvwLww2WPj8ANy8jTiEgvABEAksxNUjsR8RaRdAAnAGxW1TpzOrxXTD1h7G5HAGAFgMWo+pdnMYCXUfXD7nL15HwawK2uTVRTfVs7qOo8APOqt3b4E0y6ArghW1CIyDxU/Tf4Q1dmu1xDt8pwQ1LL59zyf2ieQkTaAPgYwJ+v+N+v21DVCgCDq9+XWiciYapq9/2LJi32hm5HICJ/Q9XasCns5RSRgQCuA5AhIkDV0sEeERmmqsddGNFjtnaoL6eIPADg1wDGqIkXUVzF76e7OQKg52WPAwEcNSmLxxMRX1SV+oeq+r9m56mPqp4Wke2oev/CbrGbeVbMNZc9nIg6QppFVb9V1a6q2ktVe6HqhyrS1aVeH0/Z2kFExgN4EsAdqnrO7DweKgVAsIhcJyItAEwB8JnJmTySVM3WVgHIUdVXzM5jj4gEXDqDTET8AIxFPT/jpl15KiL/QNU7vArgEIDpqnrMlDANJCKHAESpqltt7ykiH6NqO09jawdV/dHcVDWJyH4ALQH8XP2p3ara0G0oXEZEJgJ4HUAAgNMA0lU11txU/1V9avCrALwBvKOqS0yOVIOIfATgZlRth/sTgAWqusrUUFcQkZEAdgL4FlU/OwDwtLudoSci4QD+jqo/by8A/1LVRXU+h1sKEBFZi9lnxRARkZOx2ImILIbFTkRkMSx2IiKLYbETEVkMi52IyGJY7EREFvP/AaYEjFK1oEI2AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x6ec3c670>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "soa = np.array([[0, 0, -1, 2], [0, 0, -3, -1], [0, 0, -4, 1],[-3,-1,-1,2]])\n",
    "X, Y, U, V = zip(*soa)\n",
    "plt.figure()\n",
    "ax = plt.gca()\n",
    "ax.quiver(X, Y, U, V, angles='xy', scale_units='xy', scale=1)\n",
    "ax.set_xlim([-5, 3])\n",
    "ax.set_ylim([-3, 3])\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-4  1]\n",
      "[-4  1]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "a = np.array([-1, 2])\n",
    "b = np.array([3, 1])\n",
    "print(a - b)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 乘法\n",
    "\n",
    "##### 標量乘以向量\n",
    "\n",
    "標量$c$乘以向量$\\mathbf{a}$定義為：$c \\cdot \\mathbf{a} = \\begin{bmatrix} c \\cdot a_1 \\\\ c \\cdot a_2 \\\\ \\ldots \\\\ c \\cdot a_n \\end{bmatrix} = \\begin{bmatrix} a_1 \\cdot c \\\\ a_2 \\cdot c \\\\ \\ldots \\\\ a_n \\cdot c \\end{bmatrix}$<br>\n",
    "用圖來示意$\\mathbf{a} \\begin{bmatrix} -1 \\\\2 \\end{bmatrix}$乘以一個標量$3$得到$\\begin{bmatrix}-3 \\\\ 6 \\end{bmatrix}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-3  6]\n",
      "[-3  6]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "a = np.array([-1,2])\n",
    "print(3 * a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 向量點積\n",
    "\n",
    "定義如下：$\\vec{\\mathbf{a}}\\cdot \\vec{\\mathbf{b}} = \\begin{bmatrix} a_1 \\\\ a_2 \\\\ \\ldots \\\\ a_n\\end{bmatrix} \\cdot \\begin{bmatrix} b_1 \\\\ b_2 \\\\ \\ldots \\\\ b_n \\end{bmatrix} = a_{1}b_{1} + a_{2}b_{2} + \\ldots + a_{n}b_{n}$ 可以看出，向量點積得到的是一個標量；<br>\n",
    "例如: $\\begin{bmatrix} 3 \\\\ 5 \\\\ 2 \\end{bmatrix} \\cdot \\begin{bmatrix} 1 \\\\ 4 \\\\ 7 \\end{bmatrix} = 3 \\cdot 1 + 5 \\cdot 4 + 2 \\cdot 7 = 37$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "37\n",
      "[ 27 -19   7]\n",
      "37\n",
      "[ 27 -19   7]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "vec_1 = np.array([3,5,2])\n",
    "vec_2 = np.array([1,4,7])\n",
    "print(np.dot(vec_1, vec_2)) # dot product of vectors\n",
    "print(np.cross(vec_1, vec_2)) # cross multipication of vectors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x6ec43ab0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x6ec43ab0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "soa = np.array([[0, 0, -1, 2], [0, 0, -3, 6]])\n",
    "X, Y, U, V = zip(*soa)\n",
    "plt.figure()\n",
    "ax = plt.gca()\n",
    "ax.quiver(X, Y, U, V, angles='xy', scale_units='xy', scale=1)\n",
    "ax.set_xlim([-3, 3])\n",
    "ax.set_ylim([-3, 8])\n",
    "plt.draw()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看出，第一個答案是點乘出來的結果，在`python-numpy`中，我們用`np.dot(vector, vector)`來計算兩個或多個向量的點積。而`(vector * vector)`則是計算向量的叉乘結果，下面來介紹一下叉乘（向量積）：<br>\n",
    "它是向量和向量的乘積，不過結果是一個向量，它的集合意義是所得的向量和被乘向量所在的平面垂直，方向由右手定則規定，大小是兩個被乘向量張成的平行四邊形的面積。所以，向量積不滿足交換律。下面主要介紹在$\\mathbf{R}^2$和$\\mathbf{R}^3$的情況下的向量積：<br>\n",
    "$\\mathbf{R}^2$的向量積：<br>\n",
    "<center>$\\begin{bmatrix} a_1 \\\\ a_2\\end{bmatrix} \\times \\begin{bmatrix} b_1 \\\\ b_2 \\end{bmatrix} = \\begin{bmatrix} a_1 \\cdot b_2 - a_2 \\cdot b_1\\end{bmatrix}$</center><br>\n",
    "例如：<center>$\\begin{bmatrix} 1 \\\\ 2 \\end{bmatrix} \\times \\begin{bmatrix} 3 \\\\4 \\end{bmatrix} \n",
    "=\\begin{bmatrix} 1 \\cdot 4 - 3 \\cdot 2 \\end{bmatrix}= \\begin{bmatrix}-2\\end{bmatrix}$</center>\n",
    "\n",
    "$\\mathbf{R}^3$的向量積：<br>\n",
    "<center>$\\begin{bmatrix} a_1 \\\\ a_2 \\\\ a_3\\end{bmatrix} \\times \\begin{bmatrix} b_1 \\\\ b_2 \\\\ b_3 \\end{bmatrix} = \\begin{bmatrix} a_2 \\cdot b_3 - a_3 \\cdot b_2 \\\\ a_3 \\cdot b_1 - a_1 \\cdot b_3 \\\\ a_1 \\cdot b_2 - a_2 \\cdot b_1\\end{bmatrix}$</center><br>\n",
    "例如：<center>$\\begin{bmatrix} 3 \\\\ 5 \\\\ 2 \\end{bmatrix} \\times \\begin{bmatrix} 1 \\\\ 4 \\\\ 7 \\end{bmatrix} =\\begin{bmatrix} 5 \\cdot 7 - 2 \\cdot 4 \\\\ 2 \\cdot 1 - 3 \\cdot 7 \\\\ 3 \\cdot 4 - 5 \\cdot 1\\end{bmatrix}= \\begin{bmatrix} 27 \\\\ -19 \\\\ 7\\end{bmatrix}$</center><br>\n",
    "可以看出，向量積的結果就是一個新的向量。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 27 -19   7]\n",
      "[ 27 -19   7]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "a = np.array([3, 5, 2])\n",
    "b = np.array([1, 4, 7])\n",
    "print(np.cross(a, b)) # cross multipication of vec a and vec b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "之前我們所講的向量長度的定義式：$\\left\\| \\vec{\\mathbf{v}} \\right\\| = \\sqrt{v_{1}^{2} + v_{2}^{2} + \\ldots + v_{n}^{2}}$，如果我們連立向量點積的定義就可以得出$\\parallel \\mathbf{v} \\parallel = \\sqrt{\\vec{v}\\cdot \\vec{v}}$<br>\n",
    "關於點積，還有一個重要的重要的性質，就是**柯西不等式**：\n",
    "**對於兩個非零向量，$\\vec{x}, \\vec{y} \\in \\mathbf{R}^n, |\\vec{x}\\cdot \\vec{y}| \\leq \\parallel \\mathbf{x}\\parallel \\parallel\\mathbf{y} \\parallel$，當且僅當$\\vec{\\mathbf{x}} = c\\vec{\\mathbf{y}}$時，等號成立**。證明如下：<br>\n",
    "<center>$\\begin{align}\n",
    "\\left\\|\\vec{\\mathbf{x}} + \\vec{\\mathbf{y}}\\right\\|^2 & = (\\vec{\\mathbf{x}} + \\vec{\\mathbf{y}})\\cdot (\\vec{\\mathbf{x}} + \\vec{\\mathbf{y}}) \\\\\\\n",
    " & = \\left\\|\\vec{\\mathbf{x}}\\right\\|^2 + 2\\vec{\\mathbf{x}}\\vec{\\mathbf{y}} + \\left\\|\\vec{\\mathbf{y}}\\right\\|^2 \\\\\\\n",
    "& \\le \n",
    "\\left\\|\\vec{\\mathbf{x}}\\right\\|^2 + 2\\left\\|\\vec{\\mathbf{x}}\\right\\|\\left\\|\\vec{\\mathbf{y}}\\right\\| + \\left\\|\\vec{\\mathbf{y}}\\right\\|^2\n",
    "\\end{align}$</center><br>\n",
    "所以：<br>\n",
    "<center>$\\left\\|\\vec{\\mathbf{x}} + \\vec{\\mathbf{y}}\\right\\|^2 \\le (\\left\\|\\vec{\\mathbf{x}}\\right\\| + \\left\\|\\vec{\\mathbf{y}}\\right\\|)^2$</center><br>\n",
    "兩邊開平方後：<br>\n",
    "<center>$\\left\\|\\vec{\\mathbf{x}} + \\vec{\\mathbf{y}}\\right\\| \\le \n",
    "\\left\\|\\vec{\\mathbf{x}}\\right\\| + \\left\\|\\vec{\\mathbf{y}}\\right\\|$</center><br>\n",
    "這也就是我們高中三角函數裡學過的**三角不等式**，從幾何的角度來說，向量的點積和向量的夾角$\\theta$的餘弦值時有關的：$\\vec{\\mathbf{a}}\\cdot\\vec{\\mathbf{b}} = \\left\\|\\vec{\\mathbf{a}}\\right\\|\\left\\|\\vec{\\mathbf{b}}\\right\\|cos\\theta$                                                                      "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "從另一個角度來看，這其實就是一個向量在另一個向量上的投影: $Proj_L({\\vec{\\mathbf{x}}}) =  c\\vec{\\mathbf{v}} = (\\frac{\\vec{\\mathbf{x}}\\cdot \\vec{\\mathbf{v}}}{\\vec{\\mathbf{v}}\\cdot \\vec{\\mathbf{v}}})\\vec{\\mathbf{v}}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 1.5  1.5]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "#the first way to define the function\n",
    "def get_projection(a, b):\n",
    "    return a.dot(b)*1.0*b/b.dot(b)\n",
    "\n",
    "a = np.array([1, 2])\n",
    "b = np.array([2, 2])\n",
    "print(get_projection(a, b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 1.5  1.5]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np \n",
    "#the second way to define the function \n",
    "find_projection = lambda a, b : a.dot(b) * 1.0 * b/b.dot(b)\n",
    "\n",
    "a = np.array([1, 2])\n",
    "b = np.array([2, 2])\n",
    "\n",
    "print(find_projection(a,b))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "這時候再考慮向量積，從集合的角度，向量積和向量間的夾角$\\theta$的正弦值有關：$\\left\\|\\vec{\\mathbf{a}}\\times\\vec{\\mathbf{b}}\\right\\| = \\left\\|\\vec{\\mathbf{a}}\\right\\|\\left\\|\\vec{\\mathbf{b}}\\right\\|sin\\theta$，這就意味著，向量的向量積反應了兩個向量的正交程度（正交：向量積等於零），$sin\\theta = 0$ 正交程度最小，$sin\\theta = 1$，正交程度最大。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 矩陣的向量積\n",
    "\n",
    "*矩陣乘法*\n",
    "我們可以將向量理解成一個$1 \\times n$的矩陣，當矩陣$A$的列數與向量$\\vec x$的分量數目想等式，矩陣和向量的積有定義：<br>\n",
    "<center>$\\underset{m\\times n}{A}\\vec{\\mathbf{x}}=\\begin{bmatrix}a_{11} & a_{12} & \\ldots & a_{1n} \\\\ a_{21} & a_{22} & \\ldots & a_{2n} \\\\ \\ldots \\\\ a_{m1} & a_{m2} & \\ldots & a_{mn}\\end{bmatrix}\\begin{bmatrix}x_1 \\\\ x_2 \\\\ \\ldots \\\\ x_n \\end{bmatrix} = \\begin{bmatrix}a_{11}x_1 + a_{12}x_2 + \\ldots + a_{1n}x_n \\\\ a_{21}x_1 + a_{22}x_2 + \\ldots + a_{2n}x_n \\\\ \\ldots \\\\ a_{m1}x_1 + a_{m2}x_2 + \\ldots + a_{mn}x_n \\\\ \\end{bmatrix}$</center><br><br>\n",
    "例：$\\begin{bmatrix}4 & 3 & 1 \\\\ 1 & 2 & 5\\end{bmatrix}  \\begin{bmatrix}5 \\\\ 2 \\\\ 7\\end{bmatrix} = \\begin{bmatrix}4\\cdot 5 + 3\\cdot 2 + 1\\cdot 7 \\\\ 1 \\cdot 5 + 2 \\cdot 2 + 5 \\cdot 7\\end{bmatrix} = \\begin{bmatrix}33 \\\\ 44\\end{bmatrix}$</center>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "矩陣的向量積，可以當作時矩陣的所有列向量的線性組合：<br>\n",
    "$\\underset { m\\times n }{ \\mathbf{A} } \\vec { \\mathbf{x} } =\\begin{bmatrix} \\underbrace { \\begin{bmatrix} a_{ 11 } \\\\ a_{ 21 } \\\\ \\ldots \\\\ a_{ m1 } \\end{bmatrix} }_{ \\vec { \\mathbf{ V }_{ 1 } }  }  & \\underbrace { \\begin{bmatrix} a_{ 12 } \\\\ a_{ 22 } \\\\\\ldots  \\\\ a_{ m2 } \\end{bmatrix} }_{ \\vec { \\mathbf{ V_{ 2 } } }  } & \\ldots & \\underbrace { \\begin{bmatrix} a_{ 1n } \\\\ a_{ 2n } \\\\ \\ldots \\\\ a_{ mn } \\end{bmatrix} }_{ \\vec { \\mathbf{ V_{ n } } }  }  \\end{bmatrix}\\begin{bmatrix} x_{ 1 } \\\\ x_{ 2 } \\\\ \\ldots \\\\ x_{ n } \\end{bmatrix}=x_1\\vec{\\mathbf{V}_1}+x_2\\vec{\\mathbf{V}_2}+\\ldots+x_n\\vec{\\mathbf{V}_n}$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "而向量$\\vec{x}$的每一個份量可以看成$\\mathbf{A}$的每一個列向量的加權。**一個矩陣其實就是一個線性變換，一個矩陣乘以一個向量後得到的向量，其實就相當於將這個向量進行了線性變換。**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 向量的轉置 \n",
    "\n",
    "向量$ \\vec{\\mathbf{V}} = \\underbrace{\\begin{bmatrix}v_1 \\\\ v_2 \\\\ \\ldots \\\\ v_n \\end{bmatrix}}_{n\\times 1}$ 的轉置定義為$\\mathbf{V}^T = \\underbrace{\\begin{bmatrix}v_1 & v_2 & \\ldots & v_n \\end{bmatrix}}_{1 \\times n}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[2]\n",
      " [4]]\n"
     ]
    }
   ],
   "source": [
    "# we use V = (2,4) to give a example\n",
    "import numpy as np\n",
    "\n",
    "vec_3 = np.array([[2,4]]) # if we use double bracket, we are writing a two dimentional vecotr\n",
    "print(vec_3.T) # print the transport of vec_3"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "向量的轉置有一個性質：一個向量$\\vec {v}$ 點乘另一個向量$\\vec{w}$，其結果和向量$\\vec{v}$轉置後和向量$\\vec{w}$做矩陣乘法相同。即：$\\vec{\\mathbf{v}} \\cdot \\vec{\\mathbf{w}} = \\vec{\\mathbf{v}}^T \\vec{\\mathbf{w}}$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Chapter Four Vector Space\n",
    "\n",
    "### 張成空間（span）\n",
    "\n",
    "一組向量的張成空間，說白了就是指這些向量隨便線性組合後能夠表示多少個向量，也被稱為線性生成空間。記做$span(S)$；如果$S = \\{v_1, v_2, \\dots, v_n\\}$是 $V$的有限子集，則生成空間為：$span(S) = span(v_1, v_2, \\dots, v_n) = \\{\\lambda_1 v_1, \\lambda_2 v_2, \\dots, \\lambda_n v_n|\\lambda_1, \\lambda_2, \\dots, \\lambda_n \\in K\\}$\n",
    "<br>\n",
    "例如，對於$\\mathbf{R}^2$空間中兩個不平行的非零向量$\\vec{vec_4} = \\begin{bmatrix} 2 \\\\ 1 \\end{bmatrix}$和向量$\\vec{vec_5} = \\begin{bmatrix} 0 \\\\ 3 \\end{bmatrix}$，不難發現，這兩個向量可以表示二維空間$\\mathbf{R}^2$中的任意一個向量，即，$span(\\vec{vec_4}, \\vec{vec_5}) = \\mathbf{R}^2$，證明如下："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "對於$\\mathbf{R}^2$中任意向量$\\begin{bmatrix} x \\\\ y \\end{bmatrix}$，假設可以用$vec_4$和$vec_5$線性組合而成，<br>\n",
    "那麼有：$c_1 \\begin{bmatrix}2 \\\\ 1\\end{bmatrix} + c_2 \\begin{bmatrix} 0 \\\\ 3 \\end{bmatrix} = \\begin{bmatrix} x \\\\ y \\end{bmatrix}$<br>\n",
    "即：$\\left\\{\n",
    "\\begin{align}\n",
    "c_1 \\cdot 2 & + c_2 \\cdot 0 &= x\\\\\\\n",
    "c_1 \\cdot 1 & + c_2 \\cdot 3 &= y\n",
    "\\end{align}\n",
    "\\right.$ <br>\n",
    "求解得：\n",
    "$\\left\\{\n",
    "\\begin{align}\n",
    "c_1 &= \\frac{x}{2}\\\\\n",
    "c_2 &= \\frac{y}{3} - \\frac{x}{6}\n",
    "\\end{align}\n",
    "\\right.$<br>\n",
    "由於$x, y$的值已經確定，所以$c_1，c_2$的值也必然是唯一的。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 線性相關和線性無關（Linearly Dependent and Linearly Independent）\n",
    "\n",
    "在線性代數裡，向量空間的一組元素中，若沒有向量可用有限個其他向量的線性組合所表示，则稱為線性無關或線性獨立（linearly independent），反之稱為線性相關（linearly dependent）。例如在三維歐幾里得空間$\\mathbf{R}^3$的三個向量$(1, 0, 0)，(0, 1, 0)$ 和$(0, 0, 1)$線性無關。但$(2, −1, 1)，(1, 0, 1)$和 $(3, −1, 2)$線性相關，因為第三個是前兩個的和。<br>\n",
    "*相信各位都已知道那八條還是十條相關性，這裡不做贅述*<br>\n",
    "上面那個例子例如，$\\vec{vec_4} = \\begin{bmatrix} 2 \\\\ 1 \\end{bmatrix}$和向量$\\vec{vec_5} = \\begin{bmatrix} 0 \\\\ 3 \\end{bmatrix}$，如果給他們再加一個向量$\\vec{vec_6} = \\begin{bmatrix} 5 \\\\ 2 \\end{bmatrix}$，由於$\\vec{vec_5}$可以由其他兩個向量線性組合而成，由三個向量共同張成的空間並沒有發生變化，仍然是$\\mathbf{R}^3$，因此稱集合$\\{\\vec{vec_3}, \\vec{vec_4}, \\vec{vec_5}\\}$線性相關。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 如何判斷是否線性相關\n",
    "\n",
    "一個向量集合$s = v_1, v_2, \\dots, v_n$ 線性相關的充分必要是存在一部分非零係數使得：$c_1v_1 + c_2v_2 + \\dots + c_nv_n = \\begin{bmatrix} 0 \\\\ 0 \\\\ \\dots \\\\ 0 \\end{bmatrix}$。<br>\n",
    "例如：向量：$\\begin{bmatrix}2 \\\\ 1\\end{bmatrix}$ 和 $\\begin{bmatrix}3 \\\\ 2\\end{bmatrix}$，則先寫出如下等式：\n",
    "$c_1 \\begin{bmatrix}2 \\\\ 1\\end{bmatrix} + c_2 \\begin{bmatrix}3 \\\\ 2\\end{bmatrix} = \\begin{bmatrix}0 \\\\ 0\\end{bmatrix}$,<br>\n",
    "容易求解得：$\\begin{bmatrix}c_1 \\\\ c_2\\end{bmatrix} = \\begin{bmatrix}0 \\\\ 0\\end{bmatrix}$，說明這兩個向量線性無關。<br>\n",
    "類似的，對於三個$\\mathbf{R}^3$中的向量$\\begin{bmatrix}2 \\\\ 0 \\\\ 0\\end{bmatrix}, \\begin{bmatrix} 0 \\\\ 1 \\\\ 0\\end{bmatrix}$和$\\begin{bmatrix} 0 \\\\ 0 \\\\ 7\\end{bmatrix}$，不難判斷出它們是線性無關的，它們共同張成了$\\mathbf{R}^3$空間。<br>\n",
    "而對於向量集合：$\\left\\{\\begin{bmatrix}2 \\\\ 1\\end{bmatrix}, \\begin{bmatrix}3 \\\\ 2\\end{bmatrix}, \\begin{bmatrix}1 \\\\ 2 \\end{bmatrix}\\right\\}$，不難算出存在非零係數：$\\begin{bmatrix}c_1 \\\\ c_2 \\\\ c_3\\end{bmatrix} = \\begin{bmatrix}-4 \\\\ 3 \\\\ -1\\end{bmatrix}$ 使得 $c1 \\begin{bmatrix}2 \\\\ 1\\end{bmatrix} + c_2 \\begin{bmatrix}3 \\\\ 2\\end{bmatrix} + c_3 \\begin{bmatrix}1 \\\\ 2 \\end{bmatrix} = \\begin{bmatrix}0 \\\\ 0\\end{bmatrix}$。因此，此集合線性相關。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Chapter Five Linear Algebra Advanced Text\n",
    "\n",
    "在前面幾張，已經簡單介紹了線性代數中最基本的數據表達方式：**矩陣**和**向量**。有了這兩個數學工具作為基礎，我們可以進一步討論下面的內容：<br>\n",
    "1. 如何理解線性代數的基。<br>\n",
    "2. 向量中的子空間、另空間、列空間、行空間、零空間都是什麼？我們應該如何求解？<br>\n",
    "3. 如何用線性代數的知識來擬合數據？<br>\n",
    "4. 機器學習、圖形處理中常見的“特徵向量”究竟是什麼？它和變換矩陣有什麼關係？<br>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 階梯形矩陣（Echelon Matrix）\n",
    "\n",
    "階梯形矩陣是一類非常實用的工具，可以幫助我們求解線性空間的基，這就是能用在諸如計算解不是唯一的方程組之類的問題上。\n",
    "<br>\n",
    "#### 階梯形矩陣\n",
    "\n",
    "若矩陣$\\mathbf{A}$滿足如下條件：<br>\n",
    "1. 若有零行（元素全為零的行），則零行應在最下方；<br>\n",
    "2. 非零首元（即非零行的第一個不為零的元素）的列標號隨行標號的增加而嚴格遞增。<br>\n",
    "\n",
    "則這個矩陣稱為階梯形矩陣。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "示例：<br>\n",
    "<center>$\\begin{bmatrix}\n",
    "2 & 0 & 2 & 1 \\\\\n",
    "0 & 5 & 2 & -2 \\\\\n",
    "0 & 0 & 3 & 2 \\\\\n",
    "0 & 0 & 0 & 0\n",
    "\\end{bmatrix}$</center>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 行簡化階梯形矩陣（Row Echelon Matrix）\n",
    "\n",
    "若矩陣$\\mathbf{A}$滿足如下條件：<br>\n",
    "1. 它是階梯形矩陣;<br>\n",
    "2. 非零首元所在列出了非零首元外，其餘元素都為零。<br>\n",
    "\n",
    "則稱此矩陣為行簡化階梯形矩陣。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "示例：<br>\n",
    "<center>$\\begin{bmatrix}\n",
    "2 & 0 & 2 & 1 \\\\\n",
    "0 & 5 & 2 & -2 \\\\\n",
    "0 & 0 & 3 & 2 \\\\\n",
    "0 & 0 & 0 & 0\n",
    "\\end{bmatrix}$</center>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 行最簡階梯形矩陣（reduced row echelon form）\n",
    "\n",
    "若矩陣$\\mathbf{A}$滿足如下條件：<br>\n",
    "1. 它是行簡化階梯形矩陣；<br>\n",
    "2. 非零首元都為一。<br>\n",
    "\n",
    "則稱它為行最簡階梯形矩陣。下面我們來講講如何將矩陣化簡為最簡階梯形：<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "對於這個矩陣$\\mathbf{A} = \\begin{bmatrix}\n",
    "1 & 2 & 1 & 1 & 7\\\\ \n",
    "1 & 2 & 2 & -1 & 12\\\\ \n",
    "2 & 4 & 0 & 6 & 4\n",
    "\\end{bmatrix}$，使用**初等變換（Elementary Operations of Linear System）**就可以將矩陣轉換成如下形式：\n",
    "$\\begin{bmatrix}\n",
    "1 & 2 & 1 & 1 & 7\\\\ \n",
    "1 & 2 & 2 & -1 & 12\\\\ \n",
    "2 & 4 & 0 & 6 & 4\n",
    "\\end{bmatrix}\n",
    "\\rightarrow\n",
    "\\begin{bmatrix}\n",
    "1 & 2 & 1 & 1 & 7\\\\ \n",
    "0 & 0 & 1 & -2 & 5\\\\ \n",
    "2 & 4 & 0 & 6 & 4\n",
    "\\end{bmatrix}\n",
    "\\rightarrow\n",
    "\\begin{bmatrix}\n",
    "1 & 2 & 1 & 1 & 7\\\\ \n",
    "0 & 0 & 1 & -2 & 5\\\\ \n",
    "0 & 0 & -2 & 4 & -10\n",
    "\\end{bmatrix}\n",
    "\\rightarrow\n",
    "\\begin{bmatrix}\n",
    "1 & 2 & 1 & 1 & 7\\\\ \n",
    "0 & 0 & 1 & -2 & 5\\\\ \n",
    "0 & 0 & 0 & 0 & 0\n",
    "\\end{bmatrix}\n",
    "\\rightarrow\n",
    "\\begin{bmatrix}\n",
    "1 & 2 & 0 & 3 & 2\\\\ \n",
    "0 & 0 & 1 & -2 & 5\\\\ \n",
    "0 & 0 & 0 & 0 & 0\n",
    "\\end{bmatrix}$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**行最簡形**非常實用，可以用來解方程（滑稽；例如下面這個方程組：<br>\n",
    "<center>$\\left\\{ \n",
    "\\begin{eqnarray} \n",
    "x_1 + 2x_2 + x_3 + x_4 &=& 7 \\\\\\\n",
    "x_1 + 2x_2 + 2x_3 - x_4 &=& 12 \\\\\\\n",
    "2x_1 + 4x_2 + 6x_4 &=& 4\n",
    "\\end{eqnarray}\n",
    "\\right.$</center>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "按照常理，只有三個方程，肯定無法求解出四個未知數，此時，如果我們使用`numpy.linalg.solve`，求解時就會觸發`LinAlgError`，但是通過化成最簡形，我們可以進一步找出變量的憲制關係。首先，將方程組表達成增廣矩陣形式：<br>\n",
    "<center>$\\begin{bmatrix}\n",
    "1 & 2 & 1 & 1 & 7\\\\ \n",
    "1 & 2 & 2 & -1 & 12\\\\ \n",
    "2 & 4 & 0 & 6 & 4\n",
    "\\end{bmatrix}$</center>\n",
    "<br>\n",
    "然後將其行簡化，得：<br>\n",
    "<center>$\\begin{bmatrix}\n",
    "1 & 2 & 0 & 3 & 2\\\\ \n",
    "0 & 0 & 1 & -2 & 5\\\\ \n",
    "0 & 0 & 0 & 0 & 0\n",
    "\\end{bmatrix}$</center>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "從結果可以看出這個矩陣的主列有兩個，而且是線性無關的。所以矩陣$A$的秩是$2$，，即，$rank\\mathbf{(A)} = 2$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**矩陣的秩的一個特性：矩陣$A$等於矩陣$A$的轉置地秩序，即，**$rank(\\mathbf{A})=rank(\\mathbf{A^T})$<br>\n",
    "在`python`中，可以使用`numpy`包中的`linalg.matrix_rank`方法計算矩陣的秩："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "a = np.matrix('1 1 1 1;1 2 3 4;4 3 2 1')\n",
    "print(np.linalg.matrix_rank(a))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**注意**⚠️，在`numpy`中的秩和線性代數裡的秩不是同一個概念。在`numpy`中維度（dimensions）叫做軸（axes），軸的個數叫做秩。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n",
      "2\n",
      "3\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.5/dist-packages/ipykernel_launcher.py:4: VisibleDeprecationWarning: `rank` is deprecated; use the `ndim` attribute or function instead. To find the rank of a matrix see `numpy.linalg.matrix_rank`.\n",
      "  after removing the cwd from sys.path.\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "a = np.matrix('1 1 1 1;1 2 3 4; 0 0 1 0')\n",
    "print (a.ndim)  # 2（维度）\n",
    "print (np.rank(a))  # 2（a.ndim 的别名，已经过时）\n",
    "print (np.linalg.matrix_rank(a))  # 3（秩）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 行空間\n",
    "\n",
    "有了列空間的定義，行空間顧名思義其實就是矩陣每一行轉置得到的向量張成的自空間，也就是矩陣的轉置的列空間，記做：$R(\\mathbf{A}) = C(\\mathbf{A}^T)$<br>\n",
    "例如：矩陣$\\mathbf{A} = \\begin{bmatrix}1 & 1 & 1 & 1 \\\\ 1 & 2 & 3 & 4 \\\\4 & 3 & 2 & 1\\end{bmatrix}$的行空間就等於：$R(\\mathbf{A}) = C(\\mathbf{A}^T) = span\\left(\\begin{bmatrix}1 \\\\ 1 \\\\ 1 \\\\ 1\\end{bmatrix}\\begin{bmatrix}1 \\\\ 2 \\\\ 3 \\\\ 4\\end{bmatrix}\\begin{bmatrix}4 \\\\ 3 \\\\ 2 \\\\ 1\\end{bmatrix}\\right)$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 零空間\n",
    "\n",
    "上面已經講過了零空間，現在這裡的零空間是指矩陣$A^T$的零空間，也就是**左零空間**。即：$N(\\mathbf{A}^T) = \\left\\{ \\vec{\\mathbf{x}} | \\mathbf{A}^{T} \\vec{\\mathbf{x}} = \\vec{\\mathbf{0}} \\right\\} = \\left\\{ \\vec{\\mathbf{x}} | \\vec{\\mathbf{x}}^{T} \\mathbf{A} = \\vec{\\mathbf{0}}^{T} \\right\\}$<br>\n",
    "例如，矩陣$\\mathbf{B} = \\begin{bmatrix}1 & 1 & 4 \\\\ 1 & 2 & 3 \\\\1 & 4 & 2\\\\ 1 & 3 & 1\\end{bmatrix}$的轉置是矩陣$\\mathbf{A} = \\mathbf{A} = \\begin{bmatrix}1 & 1 & 1 & 1 \\\\ 1 & 2 & 3 & 4 \\\\4 & 3 & 2 & 1\\end{bmatrix}$，因此左零空間等於：$N(\\mathbf{B^T}) = N(\\mathbf{A}) = span\\left(\\begin{bmatrix} 1 \\\\ -2 \\\\ 1 \\\\ 0 \\end{bmatrix} \\begin{bmatrix} 2 \\\\ -3 \\\\ 0 \\\\ 1 \\end{bmatrix}\\right)$；由於轉置是對稱的，所以矩陣$A$的轉置的左零空間也是矩陣$A$的零空間。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 子空間的正交補\n",
    "\n",
    "假設$V$是$R^n$的一個子空間，那麼$V$的正交補$V^\\perp$也是一個子空間，定義為$\\left\\{\\vec{\\mathbf{x}} | \\vec{\\mathbf{x}} \\vec{\\mathbf{v}}=0\\right\\}$，也就是說$R^n$中所有正交於$V$的向量所組成的子空間。<br>\n",
    "由於正交是對稱的，所以正交補也是對稱的。一個子空間的正交補的正交補依然等於這個子空間。<br>\n",
    "矩陣的零空間是行空間的正交補：$N(\\mathbf{A}) = R(\\mathbf{A})^{\\bot}$；反過來，矩陣的左零空間是列空間的正交補：$N(\\mathbf{B}^T) = C(\\mathbf{B})^{\\bot}$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 最小二乘逼近\n",
    "\n",
    "最小二乘法是一個使用的數學工具，利用它在方程誤解的情況下給出近似解。在機器學習中，最小二乘逼近是一個重要的擬合方法。<br>\n",
    "假設有一個方程：$\\underset{n\\times k}{\\mathbf{A}}\\vec{\\mathbf{x}} = \\vec{\\mathbf{b}}$<br>\n",
    "無解。把上式寫成：$\\vec{a_1}\\vec{\\mathbf{x}} + \\vec{a_2}\\vec{\\mathbf{x}} + \\ldots + \\vec{a_k}\\vec{\\mathbf{x}} = \\vec{\\mathbf{b}}$<br>\n",
    "無解，就意味著$\\mathbf{A}$的所有列向量的張成空間不包括向量$\\vec{b}$。即：$\\vec{\\mathbf{b}} \\notin span(C(\\mathbf{A}))$<br>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我們可以通過最小二乘法，求解出近似解。即，要找出一些$\\vec{x*}$使得$\\left\\|\\vec{\\mathbf{b}}-\\mathbf{A}\\vec{\\mathbf{x}^*}\\right\\|$最小。用向量$\\vec{\\mathbf{V}}$代表$\\mathbf{A}\\vec{\\mathbf{x*}}$，有：<br>\n",
    "$\\left\\|\n",
    "\\begin{bmatrix}\n",
    "\\vec{b_1}-\\vec{v_1}\\\\\n",
    "\\vec{b_2}-\\vec{v_2}\\\\\n",
    "\\ldots\\\\\n",
    "\\vec{b_n}-\\vec{v_n}\\\\\n",
    "\\end{bmatrix}\n",
    "\\right\\|^2\n",
    "= \n",
    "(b_1-v_1)^2 + (b_2-v_2)^2 + \\ldots + (b_n-v_n)^2$<br>\n",
    "把這個值最小化的過程叫做**最小二乘逼近**。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如何求出$\\mathbf{A}\\vec{\\mathbf{x*}}$這個近似值呢？從集合上考慮，列空間可以看成空間中張成的一個平面，而平面$\\vec{b}$並不落在這個平面上。但我們知道，在這個平面上與向量$\\vec{b}$最接近的向量就是它的投影！所以，$\\mathbf{A}\\vec{\\mathbf{x}^*} = Proj_{C(\\mathbf{A})}\\vec{\\mathbf{b}}$，直接計算$Proj_{C(\\mathbf{A})}\\vec{\\mathbf{b}}$並不簡單。不過，$\\vec{\\mathbf{b}}-\\mathbf{A}\\vec{\\mathbf{x}}$其實就是$\\mathbf{A \\vec{x}}$的正交補，所以一個簡單的求解方法是將原來無解的方程做成一個$\\mathbf{A}$的轉置再求解：$\\mathbf{A}^T\\mathbf{A}\\vec{\\mathbf{x}^*} = \\mathbf{A}^T\\vec{\\mathbf{b}}$得出的解就是原方程的近似解。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 示例 解下列方程組\n",
    "$\\left\\{ \n",
    "\\begin{eqnarray} \n",
    "x + y &=& 3 \\\\\\\n",
    "x - y &=& -2 \\\\\\\n",
    "y &=& 1\n",
    "\\end{eqnarray}\n",
    "\\right.$<br>\n",
    "將三個方程表示的直線畫出來，可以看出這三條直線並沒有交點："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x696c2530>,\n",
       " <matplotlib.lines.Line2D at 0x696c25f0>,\n",
       " <matplotlib.lines.Line2D at 0x696c2db0>]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x697ae9d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from pylab import *\n",
    "\n",
    "plt.xlim(-3,3)\n",
    "plt.ylim(0,6)\n",
    "plt.plot([-2,3],[0,5],'blue',[-3,3],[6,0],'yellow',[-3,3],[1,1],'red')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "那麼，我們應該如何找出一個與三條直線距離最近的一個點呢？這時候就可以使用最小二乘逼近了。<br>\n",
    "先將方程寫成矩陣和向量的形式：<br>\n",
    "<center>$\\underbrace{\n",
    "\\begin{bmatrix}\n",
    "1 & 1 \\\\\n",
    "1 & -1 \\\\\n",
    "0 & 1\n",
    "\\end{bmatrix}\n",
    "}_{\\mathbf{A}}\n",
    "\\underbrace{\n",
    "\\begin{bmatrix}\n",
    "x \\\\\n",
    "y\n",
    "\\end{bmatrix}\n",
    "}_{\\vec{\\mathbf{x}}}\n",
    "=\n",
    "\\underbrace{\n",
    "\\begin{bmatrix}\n",
    "3 \\\\\n",
    "-2 \\\\\n",
    "1\n",
    "\\end{bmatrix}\n",
    "}_{\\vec{\\mathbf{b}}}$</center>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "這個等式的最小二乘逼近就是：<br>\n",
    "<center>$\\begin{align}\n",
    "\\begin{bmatrix}\n",
    "1 & 1 & 0 \\\\\n",
    "1 & -1 & 1\\\\\n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "1 & 1 \\\\\n",
    "1 & -1 \\\\\n",
    "0 & 1\n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "x^* \\\\\n",
    "y^*\n",
    "\\end{bmatrix}\n",
    "& = \n",
    "\\begin{bmatrix}\n",
    "1 & 1 & 0 \\\\\n",
    "1 & -1 & 1\\\\\n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "3 \\\\\n",
    "-2 \\\\\n",
    "1\n",
    "\\end{bmatrix}\n",
    "\\\\\\\n",
    "\\begin{bmatrix}\n",
    "2 & 0 \\\\\n",
    "0 & 3\n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "x^* \\\\\n",
    "y^*\n",
    "\\end{bmatrix}\n",
    "& =\n",
    "\\begin{bmatrix}\n",
    "1 \\\\\n",
    "6\n",
    "\\end{bmatrix}\n",
    "\\end{align}$</center>\n",
    "<br>\n",
    "\n",
    "由於是二解方程，我們可以很容易求出矩陣$\\begin{bmatrix}2 & 0 \\\\ 0 & 3\\end{bmatrix}$的逆是：$\\begin{bmatrix}\\frac{1}{2} & 0 \\\\ 0 & \\frac{1}{3}\\end{bmatrix}$<br>\n",
    "\n",
    "所以：\n",
    "<br>\n",
    "<center>\n",
    "$\\begin{bmatrix}\n",
    "x^* \\\\\n",
    "y^*\n",
    "\\end{bmatrix}\n",
    "=\n",
    "\\begin{bmatrix}\\frac{1}{2} & 0 \\\\ 0 & \\frac{1}{3}\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "1 \\\\\n",
    "6\n",
    "\\end{bmatrix}\n",
    "=\n",
    "\\begin{bmatrix}\n",
    "\\frac{1}{2} \\\\\n",
    "2\n",
    "\\end{bmatrix}$\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在`python`中，可以使用`numpy.linalg.lstsq`方法來求解最小二乘逼近。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x68fb39b0>"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x69041cd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from pylab import *\n",
    "\n",
    "x = [0.5]\n",
    "y = [2]\n",
    "plt.xlim(-3,3)\n",
    "plt.ylim(0,6)\n",
    "plt.plot([-2,3],[0,5],'blue',[-3,3],[6,0],'yellow',[-3,3],[1,1],'red',xData,yData1,'black')\n",
    "plt.scatter(x,y,color = 'black')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(array([ 0.5,  2. ]), array([ 1.5]), 2, array([ 1.73205081,  1.41421356]))\n"
     ]
    }
   ],
   "source": [
    "a = np.array([[1, 1], [1, -1], [0, 1]])\n",
    "b = np.array([3, -2, 1])\n",
    "x = np.linalg.lstsq(a,b)\n",
    "print(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`numpy.inalg.lstsq`的返回值包括了四個部分：<br>\n",
    "1. 最小二乘逼近，如果`b`是二維的，那麼這個逼近的結果有多個列，每一列是一個逼近解，逼近解就是$\\begin{bmatrix}0,5 \\\\ 2 \\end{bmatrix}$.<br>\n",
    "2. 殘差。即，每一個`b - a*x`的長度的和。對於上例，殘差是$1.5$.<br>\n",
    "3. 矩陣$a$的秩。對於上例，矩陣$a$的秩為$2$。<br>\n",
    "4. 矩陣$a$的歧異值。對於上例，矩陣$a$的奇異值為：$\\begin{bmatrix}1.73205081 \\\\  1.41421356\\end{bmatrix}$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 线性回归\n",
    "\n",
    "問題：給定$4$個坐標點$(-1,0),(0,1),(1,),(2,1)$，求一條經過這些點的直線$y = mx + b$。<br>\n",
    "將四個點畫圖如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x68f023d0>"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x68f14bd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from pylab import *\n",
    "\n",
    "\n",
    "x = [-1,0,1,2]\n",
    "y =[0,1,2,1]\n",
    "\n",
    "plt.scatter(x,y,color = 'black')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "顯然這樣的直線並不存在。然而我們能夠使用最小二乘逼近，找到一條盡可能靠近這些點的直線。將四個點表示成方程組的形式：<br>\n",
    "<center>\n",
    "$\\left\\{\n",
    "\\begin{eqnarray}\n",
    "f(-1) &= -m + b = 0\\\\\\\n",
    "f(0) &= 0 + b  = 1\\\\\\\n",
    "f(1) &= m + b = 2\\\\\\\n",
    "f(2) &= 2m + b = 1\n",
    "\\end{eqnarray}\n",
    "\\right.$\n",
    "</center>\n",
    "然後方程組用矩陣和向量的形式：<br>\n",
    "<center>\n",
    "    $\\underbrace{\n",
    "\\begin{bmatrix}\n",
    "-1 & 1 \\\\\n",
    "0 & 1 \\\\\n",
    "1 & 1 \\\\\n",
    "2 & 1\n",
    "\\end{bmatrix}\n",
    "}_{\\mathbf{A}}\n",
    "\\underbrace{\n",
    "\\begin{bmatrix}\n",
    "m\\\\\n",
    "b\n",
    "\\end{bmatrix}\n",
    "}_{\\vec{\\mathbf{x}}}\n",
    "=\n",
    "\\underbrace{\n",
    "\\begin{bmatrix}\n",
    "0\\\\\n",
    "1\\\\\n",
    "2\\\\\n",
    "1\n",
    "\\end{bmatrix}\n",
    "}_{\\vec{\\mathbf{b}}}$\n",
    "</center>\n",
    "這兩個等式的最小二乘逼近就是：<br><center>\n",
    "    $\\begin{align}\n",
    "\\begin{bmatrix}\n",
    "-1 & 0 & 1 & 2 \\\\\n",
    "1 & 1 & 1 & 1\n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "-1 & 1 \\\\\n",
    "0 & 1 \\\\\n",
    "1 & 1 \\\\\n",
    "2 & 1\n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "m^*\\\\\n",
    "b^*\n",
    "\\end{bmatrix}\n",
    "&=\n",
    "\\begin{bmatrix}\n",
    "-1 & 0 & 1 & 2 \\\\\n",
    "1 & 1 & 1 & 1\n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "0\\\\\n",
    "1\\\\\n",
    "2\\\\\n",
    "1\n",
    "\\end{bmatrix}\\\\\\\n",
    "\\begin{bmatrix}\n",
    "6 & 2 \\\\\n",
    "2 & 4\n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "m^*\\\\\n",
    "b^*\n",
    "\\end{bmatrix}\n",
    "&=\n",
    "\\begin{bmatrix}\n",
    "4\\\\\n",
    "4\n",
    "\\end{bmatrix}\n",
    "\\end{align}$</center>\n",
    "\n",
    "容易求得$\\begin{bmatrix}6 & 2\\\\2 & 4\\end{bmatrix}$的逆$\\frac{1}{20}\\begin{bmatrix}4 & -2\\\\-2 & 6\\end{bmatrix}$，因此<br><center>\n",
    "    $\\begin{bmatrix}m^*\\\\b^*\\end{bmatrix} = \\frac{1}{20}\\begin{bmatrix}4 & -2\\\\-2 & 6\\end{bmatrix}\\begin{bmatrix}4 \\\\ 4\\end{bmatrix} = \\frac{1}{20}\\begin{bmatrix}8 \\\\ 16\\end{bmatrix} = \\begin{bmatrix}\\frac{2}{5} \\\\ \\frac{4}{5}\\end{bmatrix}$\n",
    "</center>\n",
    "    \n",
    "將直線$y = \\frac{2}{5}x + \\frac{4}{5}$繪圖如下所示：    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x68d4ea70>]"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAD8CAYAAACfF6SlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAHvtJREFUeJzt3Xl4ldW1x/HvQqU2reIAVouS2KfcNqCIGFHrLKg4XLG3tmq5V63VqJU6XxywetUbZxFFBYJwKxpRVEqRSSYRFBkSCjJJSZWpWIygoIIyZN0/9rGNkJDhDO8Zfp/nyZMzvJy93ie6srLf/a5t7o6IiOSWZlEHICIiqafkLyKSg5T8RURykJK/iEgOUvIXEclBSv4iIjlIyV9EJAcp+YuI5CAlfxGRHLR71AHUpWXLll5QUBB1GCIiGaWiouITd29V33Fpm/wLCgooLy+POgwRkYxiZisacpymfUREcpCSv4hIDlLyFxHJQUr+IiI5SMlfRCQHKfmLiOSguJO/mR1iZm+a2RIzW2Rm19dyjJnZk2ZWaWbvmVmneMcVkfiUlZVRUFBAs2bNKCgooKysLOqQJIUSsc5/G3Czu881s72ACjOb6O6LaxxzFtA29nUM0D/2XUQiUFZWRnFxMZs2bQJgxYoVFBcXA9CjR48oQ5MUibvyd/eP3H1u7PHnwBKg9Q6HdQeGejAT2MfMDop3bBFpmt69e/8z8X9j06ZN9O7dO6KI5J8qKmDMmKQPk9A5fzMrAI4EZu3wVmtgVY3nq9n5FwRmVmxm5WZWXlVVlcjQRKSGlStXNup1SYHNm+HWW+GYY+C226C6OqnDJSz5m9n3gdeAG9x9445v1/JPfKcX3Evdvcjdi1q1qrc1hYg0UZs2bRr1uiTZ1KnQoQM8/DBcdhlMmwbNkrseJyGfbmZ7EBJ/mbuPqOWQ1cAhNZ4fDKxJxNgi0nglJSXk5eV967W8vDxKSkoiiihHbdgAV10Fp54aKv1Jk+DZZ2HffZM+dCJW+xgwGFji7n3qOGwUcEls1c+xwAZ3/yjesUWkaXr06EFpaSn5+fmYGfn5+ZSWlupibyqNGgXt2oVkf/PNsGABdOmSsuHNfafZl8Z9gNkJwHRgAfDNJNUdQBsAdx8Q+wXxFNAN2AT8xt132bKzqKjI1dVTRLLO2rVw3XUwfDgcfjgMHgxHH52wjzezCncvqu+4uJd6uvvb1D6nX/MYB66NdywRkYzlDs8/DzfeCF98AffdB716QfPmkYSTtv38RUSyxvLlYW5/wgT42c/CVE9hYaQhqb2DiEiybN8OTz4Jhx0GM2ZAv34wfXrkiR9U+YuIJMfixfDb38LMmXDWWTBgAKTRUlpV/iIiibRlC9x7L3TsCMuWhXn+MWPSKvGDKn8RkcSZPTtU+wsXwsUXQ9++cMABUUdVK1X+IiLx+vJLuOkmOO44+OwzeP11ePHFtE38oMpfRCQ+kyZBcTF8+CFccw08+CDsvXfUUdVLlb+ISFN8+ilcfjmcfjrssUfox/PMMxmR+EHJX0Skcdzh1VfDcs2hQ+H222H+fDjxxKgjaxRN+4iINNSaNdCzJ/zpT9CpE4wfH1b1ZCBV/iIi9XEPd+W2awfjxoXWy7NmZWziB1X+IiK7VlkZLui++SacfDIMGgRt20YdVdxU+YuI1GbbNnj00bDJSkUFDBwIU6ZkReIHVf4iIjt7771ws1Z5OZx3XljF03qnnWczmip/EZFvfPUV3HknHHUUrFwJL78MI0dmXeIHVf4iIsHbb8OVV8L778Mll0CfPrD//lFHlTSq/EUkt23cCNdeG9bpb94clm8+91xWJ35Q8heRXDZ2bOi1378/XH99aMh25plRR5USmvYRkdxTVQU33BCar7VrB++8E5qy5RBV/iKSO9z/lfBfeQXuvhvmzs25xA+q/EUkV6xaFbpujhkDnTvD4MFhyidHqfIXkexWXR3W6bdvH+7SffzxsJ9uDid+UOUvItls6VK44oqwjLNrVygthUMPjTqqtKDKX0Syz9atcP/9cMQRYQXPkCEwYYISfw2q/EUku1RUhNYM8+fDBRdAv35w4IFRR5V2VPmLSHbYvBl69QoXcz/+OPTcf+UVJf46qPIXkcw3dWpozVBZGeb4H3kE9tkn6qjSmip/Eclcn30Weu2fempY1TN5cui3r8RfLyV/EclMf/5zWL45eDDccgssWACnnRZ1VBlDyV9EMsvatXDhhXD++dCyZdhO8ZFHIC8v6sgyipK/iGQG99Bts7Aw9NgvKQmbrRQVRR1ZRtIFXxFJf8uXw1VXhbX6J5wQ5vV/+tOoo8poCan8zWyImX1sZgvreP8UM9tgZvNiX3clYlwRyXLbt8MTT4RWDDNmwNNPw1tvKfEnQKIq/z8CTwFDd3HMdHc/N0HjiUi2W7QoLNucORPOPjv03G/TJuqoskZCKn93nwasT8RniUiO27IF7rkHjjwyrNsvK4PRo5X4EyyVF3yPM7P5ZjbOzNrXdoCZFZtZuZmVV1VVpTA0EUkLs2ZBp07wP/8Dv/wlLF4Mv/41mEUdWdZJVfKfC+S7+xFAP2BkbQe5e6m7F7l7UatWrVIUmohE7ssv4cYbw6YqGzaESr+sDJQHkiYlyd/dN7r7F7HHY4E9zKxlKsYWkTQ3cWK4oNu3b9hsZdEiOOecqKPKeilJ/mZ2oFn4u83MOsfGXZeKsUUkTa1fD5ddBmecAd/5DkyfHlbz7L131JHlhISs9jGzYcApQEszWw3cDewB4O4DgAuAa8xsG7AZuMjdPRFji0iGcYdXX4WePWHdOrjjDvjDH2DPPaOOLKckJPm7+8X1vP8UYSmoiOSyNWvgd78LfXk6dYI33oCOHaOOKiepvYOIJJ97uCu3sDAk/IcfDit7lPgjo/YOIpJclZWh1/7UqXDKKeGXwI9/HHVUOU+Vv4gkx7ZtocI//HCYOzdsnj55shJ/mlDlLyKJN29e2Ed37lzo3j2s4mndOuqopAZV/iKSOF99Bb17hzbLq1fD8OFhL10l/rSjyl9EEmP69DC3v3RpWL//2GOw335RRyV1UOUvIvHZuBGuvRZOOgm+/jqs5vm//1PiT3NK/iLSdGPGhH10+/eHG24I++iecUbUUUkDKPmLSONVVUGPHnDuudCiRdho5fHH4fvfjzoyaSAlfxFpOPfQbbOwEF55JbRenjsXjj026sikkXTBV0QaZtUquPpqGDsWjjkGnn02dOOUjKTKX0R2rbo6rNNv1y7cpdu3L7zzjhJ/hlPlLyJ1e//9sHzz7bfh9NNh4EA49NCoo5IEUOUvIjvbuhXuvx+OOCJsrvLHP4YlnEr8WUOVv4h8W3k5XHEFzJ8Pv/oVPPkk/OAHUUclCabKX0SCTZugV69wMbeqCkaOhJdfVuLPUqr8RQTefDPM7f/tb1BcHLpxtmgRdVSSRKr8RXLZZ5+FZH/aaWAWfgkMHKjEnwOU/EVy1ciRYfnmkCFhumf+/LDZiuQETfuI5Jq1a+H3vw936B5xBLz+Ohx1VNRRSYqp8hfJFe7w3HOhNcOoUWEp55w5Svw5SpW/SC748EO46iqYOBFOOCG0ZvjJT6KOSiKkyl8km23fHrptHnYYvPtuaNPw1ltK/KLKXyRrLVwYbtaaNQvOOSf03D/kkKijkjShyl8k23z9Ndx9N3TqFNbtl5WFi7pK/FKDKn+RbPLuu/Db38KSJWGzlb59oWXLqKOSNKTKXyQbfPEFXH89HH98eDxmDLzwghK/1EmVv0ime+ONsJJnxYqwkfoDD8Bee0UdlaQ5Vf4imWrdOrj0UujWDfbcE6ZPh6eeUuKXBlHyF8k07jB8eGjN8OKL0Ls3zJsX1u+LNJCmfUQyyd//Dr/7XbhD96ijYMKE0KJBpJFU+YtkgupqKC0N1f6ECfDIIzBzphK/NFlCkr+ZDTGzj81sYR3vm5k9aWaVZvaemXVKxLgiqVZWVkZBQQHNmjWjoKCAsrKy5A+6bFlouXzVVaHaX7AAbrkFdtcf7hDRzyQbuHvcX8BJQCdgYR3vnw2MAww4FphV32ceddRRLpJOXnjhBc/Ly3Pgn195eXn+wgsvJGfArVvdH3rIfc893Vu0cB80yL26OjljZaiU/0wyAFDuDcjbFo6Nn5kVAKPd/bBa3hsITHX3YbHnS4FT3P2juj6vqKjIy8vLExKbSCIUFBSwYsWKnV7Pz89n+fLliR1s3rxws9bcuXD++aEnzw9/mNgxskBKfyYZwswq3L2ovuNSNeffGlhV4/nq2GvfYmbFZlZuZuVVVVUpCk2kYVauXNmo15vkq6/gjjugqChc3H3lFRgxQom/Din5mWSpVCV/q+W1nf7kcPdSdy9y96JWrVqlICyRhmvTpk2jXm+06dPDBdwHHoBLLoHFi+GCC8L2ilKrpP9Msliqkv9qoGZXqYOBNSkaWyQhSkpKyMvL+9ZreXl5lJSUxPfBGzeG5ZsnnQRbt4ae+0OGwH77xfe5OSBpP5MckKrkPwq4JLbq51hgw67m+0XSUY8ePSgtLSU/Px8zIz8/n9LSUnr06NH0Dx0zBtq3D5um33hjWMnTtWvigs5ySfmZ5IiEXPA1s2HAKUBLYC1wN7AHgLsPMDMDngK6AZuA37j7Lq/m6oKvZLWqqtCIbdiwsNHK4MHQuXPUUUkWaOgF34QsFHb3i+t534FrEzGWSEZzDy0Zrr8+TPfccw/cdhs0bx51ZJJjdJeISKqsXAlXXw3jxsFxx4V9dNu1izoqyVFq7yCSbNXVYZ1++/YwbRo88URY2aPELxFS5S+STO+/H/bRfecdOPNMGDAACgqijkpElb9IUmzdCiUlYd3+kiUwdGiY7lHilzShyl8k0crLQ2uG996DCy8M0zw/+EHUUYl8iyp/kUTZtCl02zzmGPjkExg5El56SYlf0pIqf5FEmDIFrrwSPvggtF5+6CFo0SLqqETqpMpfJB6ffRYu6HbpAs2awdSp4aKuEr+kOSV/kaYaMQIKC+GPf4RevcIc/8knRx2VSINo2keksf7xD+jZE157DTp2hNGjww5bIhlElb9IQ7mHbpuFhSHh338/zJ6txC8ZSZW/SEN88AEUF8PkyXDiiTBoEPzkJ1FHJdJkqvxFdmX7dujTJ3TenD0b+vcPF3WV+CXDqfIXqcuCBWElz+zZcM45IfEfckj9/04kA6jyF9nR11/DXXdBp05huufFF+H115X4Jauo8hepacaMUO0vWQL/+Z/w+OPQsmXUUYkknCp/EYAvvoDrroMTTgiPx46F559X4pespcpfZPz40JJh1aqwkfoDD8Bee0UdlUhSqfKX3LVuHVxyCZx1FuTlhQ1WnnpKiV9ygpK/5B53ePnlcLPWsGFw553wl7/A8cdHHZlIymjaR3LL6tVhauf11+Hoo2HSJOjQIeqoRFJOlb/khupqGDgw7KM7aRI89hi8+64Sv+QsVf6S/ZYtC73233oLTjsttGb40Y+ijkokUqr8JXtt2xY2VenQAebNg8GDQ9WvxC+iyl+y1Lx5YR/duXPhP/4jrOI56KCooxJJG6r8Jbts3gy33w5FRbBmDbz6aui7r8Qv8i2q/CV7TJsWWjMsWwaXXw6PPgr77ht1VCJpSZW/ZL6NG+Gaa8IWitu2wcSJYX5fiV+kTkr+ktlGjw7LN0tL4aabQhvmrl2jjkok7Sn5S2aqqoKLL4Z//3fYZ5+wZv+xx+B734s6MpGMoOQvmcU9dNssLIQRI+Dee6GiAjp3jjoykYyiC76SOVasgKuvDl04jzsOnn0W2rWLOiqRjJSQyt/MupnZUjOrNLPbann/MjOrMrN5sa8rEjGu5IjqaujXL8ztT58OTz4ZvivxizRZ3JW/me0GPA2cDqwG5pjZKHdfvMOhL7t7z3jHkxyzZElYvjljBnTrBgMGQH5+1FGJZLxEVP6dgUp3/8DdtwAvAd0T8LmSy7Zsgfvug44d4f33YejQsLuWEr9IQiQi+bcGVtV4vjr22o5+YWbvmdmrZlbrTthmVmxm5WZWXlVVlYDQJCPNmRPu0L3rLvj5z0P1/1//BWZRRyaSNRKR/Gv7P9J3eP46UODuHYBJwHO1fZC7l7p7kbsXtWrVKgGhSUb58ku4+WY49lhYvx5GjYKXXoIDDog6MpGsk4jkvxqoWckfDKypeYC7r3P3r2NPBwFHJWBcySaTJ8Phh0OfPlBcDIsWhTX8IpIUiUj+c4C2ZnaomTUHLgJG1TzAzGp21ToPWJKAcSUbfPpp6L7ZtSvsvjtMnQr9+0OLFlFHJpLV4l7t4+7bzKwn8AawGzDE3ReZ2b1AubuPAq4zs/OAbcB64LJ4x5Us8Npr0LNnuFv31lvh7rvhu9+NOiqRnGDuO07Pp4eioiIvLy+POgxJho8+Ckl/xAg48shws1anTlFHJZIVzKzC3YvqO07tHSR13GHIkHBz1pgx8MADMGuWEr9IBNTeQVLjgw/ChdzJk+Gkk8I+uv/2b1FHJZKzVPlLcm3fHrptHnYYzJ4dLua++aYSv0jEVPlL8ixYEFbyzJkD554bEv/BB0cdlYigyl+S4euv4Q9/CHP5y5fDsGHhhi0lfpG0ocpfEmvGjNCI7ZuWDI8/DvvvH3VUIrIDVf6SGJ9/Dr//PZxwQmjTMG5caMamxC+SlpT8JX7jx4cLuk8/HdbvL1wY2i+LSNpS8pemW7cOLrkEzjor7J379ttho5W99oo6MhGph5K/NJ576LZZWBgu5t51F/zlL/Czn0UdmYg0kC74SuOsXg3XXAOjR8PRR/+rG6eIZBRV/tIw1dVhC8X27UPC79MH3n1XiV8kQ6nyl/r99a9w5ZUwbRp06QKlpfCjH0UdlYjEQZW/1G3rVnjwQejQAd57LzRlmzhRiV8kC6jyl9rNnRtaM8ybB7/4BfTrBwcdVP+/E5GMoMpfvm3zZrjtNujcGf7xj7DhyquvKvGLZBlV/vIvb70V5vaXLYPLL4dHH4V99406KhFJAlX+Ahs2wNVXwymnhBbMkybB4MFK/CJZTMk/140aFXbWGjQIbr45tGHu0iXqqEQkyZT8c9XatXDhhdC9e2i+NnNmmObJy4s6MhFJASX/XOMeum22awcjR8K990J5ebhbV0Ryhi745pLly8Pc/htvhD48zz4b+vOISM5R5Z8Ltm8P3TYPOyx03uzXD6ZPV+IXyWGq/LPd4sXhZq2ZM0OP/QEDID8/6qhEJGKq/LPVli1hPv/II0NvnqFDYexYJX4RAVT5Z6fZs0O1v3AhXHQRPPEEHHBA1FGJSBpR5Z9NvvwSbroJjjsOPv00rOEfNkyJX0R2oso/W0yaBMXF8OGHYUXPgw9CixZRRyUiaUqVf6b79NPQh+f002GPPUJ/nv79lfhFZJeU/DOVe+i2WVgYLubefjvMnw8nnRR1ZCKSATTtk4nWrIFrrw136B55JIwbF76LiDRQQip/M+tmZkvNrNLMbqvl/e+Y2cux92eZWUEixs057uGu3HbtYPz4MK8/e7YSv4g0WtzJ38x2A54GzgLaARebWbsdDvst8Km7/xh4HHgo3nFzTmVl6LZ55ZXQsWPYVvHWW2H39P/jraysjIKCApo1a0ZBQQFlZWVRhySS8xJR+XcGKt39A3ffArwEdN/hmO7Ac7HHrwJdzMwSMHb227YtdNvs0AEqKmDgQJgyBdq2jTqyBikrK6O4uJgVK1bg7qxYsYLi4mL9AhCJWCKSf2tgVY3nq2Ov1XqMu28DNgD7J2Ds7DZ/fliz/9//HVbzLF4clnM2y5zr9L1792bTpk3fem3Tpk307t07oohEBBKT/Gur4L0Jx2BmxWZWbmblVVVVCQgtQ331Fdx5JxQVwcqV8PLL4eJu6x1/p6a/lStXNup1EUmNRCT/1cAhNZ4fDKyp6xgz2x1oAazf8YPcvdTdi9y9qFWrVgkILQO9/Xa4gFtSAr/+daj2f/UryNBZsjZt2jTqdRFJjUQk/zlAWzM71MyaAxcBo3Y4ZhRwaezxBcAUd9+p8s9pn38OPXvCiSfC5s1hNc9zz4VdtjJYSUkJeTvsDpaXl0dJSUlEEYkIJCD5x+bwewJvAEuA4e6+yMzuNbPzYocNBvY3s0rgJmCn5aA5bexYaN8ennkGrrsuNGQ788yoo0qIHj16UFpaSn5+PmZGfn4+paWl9OjRI+rQRHKapWsBXlRU5OXl5VGHkVyffAI33ABlZWHt/rPPhgu8IiJNZGYV7l5U33GZs2wkm7iHbpuFhTB8ONx1F8ydq8QvIimT/ncIZZtVq+Caa2DMGOjcGQYPDtsrioikkCr/VKmuDt0227eHN9+EPn1gxgwlfhGJhCr/VFi6NLRlmD4dunaF0lI49NCooxKRHKbKP5m2boX774cjjoAFC2DIEJgwQYlfRCKnyj9ZKirCPrrz58MFF0C/fnDggVFHJSICqPJPvE2boFcvOOYYWLsWRoyAV15R4heRtKLKP5GmTg1z+5WVoep/5BHYd9+ooxIR2Ykq/0TYsAGuugpOPTWs6pk8OdywpcQvImlKyT9ef/7zv+7OveWWcGH3tNOijkpEZJeU/Jtq7drQbfP886FlS5g1K0zz7NDETEQkHSn5N5Z76LZZWBiq/v/9XygvD733RUQyhC74Nsby5WFuf8IEOP74MNXz059GHZWISKOp8m+I7dvhiSdCa4YZM+Cpp2DaNCV+EclYqvzrs2hRWLY5axacfXboz6NdqEQkw6nyr8uWLXDPPWFLxcpKeOEFGD1aiV9EsoIq/9rMmhWq/UWLwj66fftCru4pLCJZSZV/TV9+CTfeGDZV2bAhVPplZUr8IpJ1VPl/Y9Kk0Jph+fKw2cqDD8Lee0cdlYhIUqjyX78efvMbOP10aN48rOJ55hklfhHJarmb/N1Dt8127eD55+H220P75RNPjDoyEZGky81pnzVr4NprYeRI6NQJxo+Hjh2jjkpEJGVyq/J3h0GDQrU/fjw8/HBY2aPELyI5Jncq/8pKKC4Om6effHL4JdC2bdRRiYhEIvsr/23bQrfNww8PWysOHAhTpijxi0hOy+7Kf/78cLNWRQV07w5PPw2tW0cdlYhI5LKz8v/qK+jdO7RZXrUKhg+HP/1JiV9EJCb7Kv8PP4SzzoKlS+HSS+Gxx2D//aOOSkQkrWRf8m/dGn78Y3jySTjjjKijERFJS9mX/Js3Dz15RESkTtk55y8iIruk5C8ikoPiSv5mtp+ZTTSzZbHv+9Zx3HYzmxf7GhXPmCIiEr94K//bgMnu3haYHHtem83u3jH2dV6cY4qISJziTf7dgedij58Dzo/z80REJAXiTf4/cPePAGLfD6jjuD3NrNzMZpqZfkGIiESs3qWeZjYJOLCWt3o3Ypw27r7GzH4ETDGzBe7+t1rGKgaKAdpoo3QRkaSpN/m7e9e63jOztWZ2kLt/ZGYHAR/X8RlrYt8/MLOpwJHATsnf3UuBUoCioiJv0BmIiEijmXvTc6yZPQKsc/cHzew2YD9377XDMfsCm9z9azNrCbwLdHf3xfV8dhWwosnBQUvgkzj+fbrIlvMAnUu6ypZzyZbzgPjOJd/dW9V3ULzJf39gONAGWAn80t3Xm1kRcLW7X2FmPwMGAtWEawx93X1wkwdteGzl7l6U7HGSLVvOA3Qu6SpbziVbzgNScy5xtXdw93VAl1peLweuiD2eARwezzgiIpJYusNXRCQHZXPyL406gATJlvMAnUu6ypZzyZbzgBScS1xz/iIikpmyufIXEZE6ZG3yN7P7zOy9WDO5CWb2w6hjaioze8TM3o+dz5/MbJ+oY2oqM/ulmS0ys+rYqrCMYmbdzGypmVXGljdnLDMbYmYfm9nCqGOJh5kdYmZvmtmS2H9b10cdU1OZ2Z5mNtvM5sfO5Z6kjZWt0z5mtre7b4w9vg5o5+5XRxxWk5jZGcAUd99mZg8BuPutEYfVJGZWSFj2OxC4JbYyLCOY2W7AX4HTgdXAHODi+u5ZSVdmdhLwBTDU3Q+LOp6mit1gepC7zzWzvYAK4PxM/LmYmQHfc/cvzGwP4G3genefmeixsrby/ybxx3wPyNjfcu4+wd23xZ7OBA6OMp54uPsSd18adRxN1BmodPcP3H0L8BKhuWFGcvdpwPqo44iXu3/k7nNjjz8HlgCto42qaTz4IvZ0j9hXUnJX1iZ/ADMrMbNVQA/grqjjSZDLgXFRB5GjWgOrajxfTYYmmWxlZgWE9jGzoo2k6cxsNzObR2iXM9Hdk3IuGZ38zWySmS2s5as7gLv3dvdDgDKgZ7TR7lp95xI7pjewjXA+aash55KhrJbXMvYvymxjZt8HXgNu2OEv/4zi7tvdvSPhL/zOZpaUKbmM3sB9V03ndvAiMAa4O4nhxKW+czGzS4FzgS6e5hdqGvFzyTSrgUNqPD8YWBNRLFJDbH78NaDM3UdEHU8iuPtnsUaY3YCEX5TP6Mp/V8ysbY2n5wHvRxVLvMysG3ArcJ67b4o6nhw2B2hrZoeaWXPgIkDbkkYsdpF0MLDE3ftEHU88zKzVN6v5zOy7QFeSlLuyebXPa8BPCCtLVhAazf092qiaxswqge8A62IvzczglUs/B/oBrYDPgHnufma0UTWcmZ0N9AV2A4a4e0nEITWZmQ0DTiF0kFwL3J2KpouJZmYnANOBBYT/3wHucPex0UXVNGbWgbAr4m6E4ny4u9+blLGyNfmLiEjdsnbaR0RE6qbkLyKSg5T8RURykJK/iEgOUvIXEclBSv4iIjlIyV9EJAcp+YuI5KD/B1Qh7Rq2YfPaAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x68df0130>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from pylab import *\n",
    "\n",
    "\n",
    "x = [-1,0,1,2]\n",
    "y =[0,1,2,1]\n",
    "x1 = np.linspace(-3,3)\n",
    "y1 = lambda x: 2*x/5 + 4/5\n",
    "plt.scatter(x,y,color = 'black')\n",
    "plt.plot(x1,y1(x1),'r')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "這就是所求的直線的近似解。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(array([ 0.4,  0.8]), array([ 1.2]), 2, array([ 2.68999405,  1.66250775]))\n"
     ]
    }
   ],
   "source": [
    "a = np.matrix('-1 1;0 1;1 1;2 1')\n",
    "b = np.array([0, 1, 2, 1])\n",
    "x = np.linalg.lstsq(a, b)\n",
    "print(x)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
